java 多线程Executor----执行器的使用

1、Executor是在Java SE5中引入的,用于管理Thread对象,使程序员无需显示地管理线程的生命周期。

上代码:

public class CachedThreadPool {
  public static void main(String[] args) {
    ExecutorService exec = Executors.newCachedThreadPool();//①
    for(int i = 0; i < 5; i++)
      exec.execute(new LiftOff());//②
    exec.shutdown();③
  }
}
①ExecutorService是具有服务生命周期的Executor,它继承Exectutor接口。

Exectutors类似于一个工厂,调用它的不同new**ThreadPool()方法,生成不同种类的线程池。

newCachedThreadPool() 缓冲线程池

newFixedThreadPool()   固定线程数目的线程池

newSingleThreadExecutor()  单线程池

ScheduledThreadPool()调度型线程池

②execute(r)方法继承自Exectutor接口,接受参数类型为Runnable对象.

③shutdown()方法:在shutdown()之前提交给Executor的任务仍然被执行,在这些任务完成后退出。(此外还有一个shutdownnow()方法,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务)

2、Exectutor还可以管理执行Callable对象。因为Runnable对象并不返回值,当需要在任务完成后需要返回一个值的情况下,就要实现Callable接口。

上代码:

class TaskWithResult implements Callable<String> {
  private int id;
  public TaskWithResult(int id) {
    this.id = id;
  }
  public String call() {//Callable必须实现的call()方法。从该方法中返回字符串。
    return "result of TaskWithResult " + id;
  }
}

public class CallableDemo {
  public static void main(String[] args) {
    ExecutorService exec = Executors.newCachedThreadPool();//创建新线程池
    ArrayList<Future<String>> results = new ArrayList<Future<String>>();
    for(int i = 0; i < 10; i++)
      results.add(exec.submit(new TaskWithResult(i)));//以Callable对象为参数,使用ExecutorService.submit()方法调用它。调用即执行Callable中的call()方法。
    for(Future<String> fs : results)
      try {
        System.out.println(fs.get());
      } catch(InterruptedException e) {
        System.out.println(e);
        return;
      } catch(ExecutionException e) {
        System.out.println(e);
      } finally {
        exec.shutdown();
      }
  }
} /* Output:
result of TaskWithResult 0
result of TaskWithResult 1
result of TaskWithResult 2
result of TaskWithResult 3
result of TaskWithResult 4
result of TaskWithResult 5
result of TaskWithResult 6
result of TaskWithResult 7
result of TaskWithResult 8
result of TaskWithResult 9
*/
在代码中我们注意到有一个叫做Future<String>的类型。( 用ExecutorService.submit(Callable c)产生的就是Future对象)Future是用来实现异步操作的一个接口,<?>用于限定类型。至于什么叫做异步,读者自己搜索一下就明白了。下面我按照java文档中的描述解释一下Future接口。

Future represents the result of an asynchronous computation. Methods are provided to check if the computation is complete, to wait for its completion, and to retrieve the result of the computation.

Future用于表示一个异步计算的结果,get()方法用于从Future获得结果(必要时会发生阻塞知道获得结果)。cancel()用于取消任务。isCanceled()判断是否已被取消。isDone()判断是否完成,该方法与get()方法相互配合能够避免阻塞的发生。

注:类似的还有FutureTask类,RunnableFuture接口,具体读者可以查询文档。



   

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值