Callable,Runnable比较及用法

编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable.

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

1、通过实现Runnable接口来创建Thread线程:

步骤1:创建实现Runnable接口的类:

class SomeRunnable implements Runnable
{
    public void run()
    {
      //do something here
    }
}

步骤2:创建一个类对象:

Runnable oneRunnable = new SomeRunnable();

步骤3:由Runnable创建一个Thread对象:

Thread oneThread = new Thread(oneRunnable);

步骤4:启动线程:

oneThread.start();

至此,一个线程就创建完成了。

注释:线程的执行流程很简单,当执行代码oneThread.start();时,就会执行oneRunnable对象中的void run();方法,

该方法执行完成后,线程就消亡了。

2、与方法1类似,通过实现Callable接口来创建Thread线程:其中,Callable接口(也只有一个方法)定义如下:

public interface Callable<V>  
{  
    V call() throws Exception;  
}
步骤1:创建实现Callable接口的类SomeCallable<Integer>(略);

步骤2:创建一个类对象:

Callable<Integer> oneCallable = new SomeCallable<Integer>();

步骤3:由Callable<Integer>创建一个FutureTask<Integer>对象:

FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable);

注释:FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口。
步骤4:由FutureTask<Integer>创建一个Thread对象:

Thread oneThread = new Thread(oneTask);

步骤5:启动线程:

oneThread.start();

至此,一个线程就创建完成了。

3、通过继承Thread类来创建一个线程:

步骤1:定义一个继承Thread类的子类:

class SomeThead extends Thraad
{
    public void run()
    {
     //do something here
    }
}

步骤2:构造子类的一个对象:

SomeThread oneThread = new SomeThread();

步骤3:启动线程:

oneThread.start();

至此,一个线程就创建完成了。

注释:这种创建线程的方法不够好,主要是因为其涉及运行机制问题,影响程序性能。

4、通过线程池来创建线程:

步骤1:创建线程池:

ExecutorService pool = Executors.newCachedThreadPool();

步骤2:通过Runnable对象或Callable对象将任务提交给ExecutorService对象:

Future<Integer> submit(Callable<Integer> task);

注释:Future是一个接口,它的定义如下:

public interface Future<T>
{
    V get() throws ...;
    V get(long timeout, TimeUnit unit) throws ...;
    void cancle(boolean mayInterrupt);
    boolean isCancelled();
    boolean isDone();
}

至此,一个线程就创建完成了。

注释:线程池需调用shutdown();方法来关闭线程。

5、通过事件分配线程直接使用程序中的原有线程:

使用方法:
直接调用EventQueue类的静态方法invokeLater():

EventQueue.invokeLater(oneRunnable);

注释:调用EventQueue.invokeLater(oneRunnable);会直接执行oneRunnable对象中的run()方法

原文:http://murielily.blog.163.com/blog/static/134260649201131215237637/

时间: 2024-10-27 11:37:49

Callable,Runnable比较及用法的相关文章

Java Callable,Runnable比较及用法

Runnable和Callable的区别是,(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值.(3)call方法可以抛出异常,run方法不可以.(4)运行Callable任务可以拿到一个Future对象, Future 表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.计算完成后只能使用 get 方法来获取结果, 如果线程没有执行完,Fut

Callable, Runnable, Future, FutureTask

Java并发编程之Callable, Runnable, Future, FutureTask Java中存在Callable, Runnable, Future, FutureTask这几个与线程相关的类或接口, 下面来了解一下它们的作用和区别. 一.Callable和Runnable Callable和Runnable类似, 实现Callable和Runnable接口的类都是可以被其他线程运行的任务, Callable和Runnable主要有以下几点区别: (1). Callable中声明的

java 创建线程的三种方法Callable,Runnable,Thread比较及用法

转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是, (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得 (3)call方法可以抛出异常,run方法

死磕java多线程

1.线程和进程 1.1线程和进程的区别 进程 它是内存中的一段独立的空间,可以负责当前应用程序的运行.当前这个进程负责调度当前程序中的所有运行细节(操作系统为进程分配一块独立的运行空间): 线程 它是位于进程中,负责当前进程中的某个具备独立运行资格的空间(进程为线程分配一块独立运行的空间): 进程是负责某个程序的执行,线程是负责进程中某个独立功能的运行,一个进程至少要包含一个线程. 多线程 在一个进程中可以开启多个线程,让多个线程同时去完成某项任务.使用多线程的目的是为了提高程序的执行效率. 1

Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

多线程系列之Thread.Runnable.Callable.Future.FutureTask 前言 多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的.这里先总结这几个类特点和区别,让大家带着模糊印象来学习这篇文章 Thread.Runnable.Callable:都是线程 Thread特点:提供了线程等待.线程睡眠.线程礼让等操作 Runnab

Java并发编程实践:Callable异步回调Future、FutureTask用法

Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到.FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,那么这个组合的使用有什么好处呢?假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这

说说Runnable与Callable

Callable接口: public interface Callable<V> { V call() throws Exception; } Runnable接口: public interface Runnable { public abstract void run(); } 相同点: 两者都是接口:(废话) 两者都可用来编写多线程程序: 两者都需要调用Thread.start()启动线程: 不同点: 两者最大的不同点是:实现Callable接口的任务线程能返回执行结果:而实现Runna

java并发编程--Runnable Callable及Future

1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合ExecutorService使用,将任务的提交与任务的执行解耦开,同时也能更好地利用Executor提供的各种特性 ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(new Runnable() { pub

Java中的Runnable、Callable、Future、FutureTask的区别与示例

Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. Runnable 其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值.然后使用某个线程去执行该runnable即可实现多线程,Thread类在调用start()函数后就是执行的是Runnable的run()函数.Runnable的声明如下