欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

First glimpse at Java Concurrent from Executors to FutureTask

程序员文章站 2022-04-21 09:26:49
...

      最近刚刚写完一个多线程的模块,感叹java concurrent强大的同时,整理了下近一周学习,打算大概记录下,

主要是读了部分concurrent包的代码. 有了java concurrent,客户端写多线程果然简单多了,首先需要用到的类是java.util.concurrent.Executors, 由它来生成线程执行器java.util.concurrent.ExecutorService,然后根据需要

可以用不同的方式运行线程,例如:单个任务可以用executorService.submit(task)或者execute(task);前者是

ExecutorService接口就有的方法,任务执行完以后可以返回值,后者是没有返回值。当然这两者区别还是蛮大的,

前者一定会将Runnable任务包装成FutureTask,后者就不一定了。多个任务可以用invokeAll/invokeAny提交执行。

简单示例:

ExecutorService es = Executors.newSingleThreadExecutor();
Future<String> r = es.submit(new Task());
es.shutdown();
try {
          r.get();//get result
} catch (InterruptedException e) {
			//
} catch (ExecutionException e) {
			//
}

 

      貌似重要学习入口在java.util.concurrent.Executors了,查看该类的说明,主要提供了java concurrent 包中ExecutorExecutorServiceScheduledExecutorServiceThreadFactoryCallable的工厂和实用方法。阅读

其代码也不多,发现他创建线程执行器大致分为两种,一种是ThreadPoolExecutor,另一种

ThreadPoolExecutor/ScheduledThreadPoolExecutor包装以后的线程执行器;创建Callable主要有两种,一是将Runnable

适配一下返回RunnableAdapter,另一是包装了Callable的PrivilegedCallable;创建ThreadFactory也主要是两种,都是

其内部类,一是DefaultThreadFactory,另一是PrivilegedThreadFactory;总之,他可以看作工厂方法类,其他创建的

ThreadFactory、Callable可以先放放。

   看完了Executors,也没看出什么。看来重要的学习入口在Executors创建的ExecutorService了。产看该接口,该接口

集成自父接口:Executor。Executor接口只定义了void execute(Runnable command)方法,用来执行提交的任务。而

ExecutorService除了execute方法之外,还定义了submit,invorkAll,invokeAny,shutdwon等等方法,主要用来执行并跟踪

多个异步任务,终止管理等。

   continue,AbstractExecutorService类提供了ExecutorService接口除了execute之外其他方法的默认实现。产看其代

码,发现真正执行任务的却是他没有实现的execute方法,其他执行线程的方法,如sumbit和invokeAll内部都会调用execute(Runnable)方法,而invokeAny方法在其调用的doInvokeAny方法中还是会在ExecutorCompletionService.submit

方法中调用execute(Runnable)方法。具体代码就不贴了,JDK中都有。这里顺便对submit,invokeAll,invokeAny方法的

区别不提了,JDK方法都有注释,比较简单。要提下,执行的任务。从void execute(Runnable command)的签名可以看出

他执行的任务是Runnable,众所周知Runnable任务是没有返回值的,若需要任务的返回值则需要Callable来作为任务,

这里Concurrent提供了Runnable和Callable的适配器。invokeAll,submit,invokeAny方法中会将Runnable包装成callable

来执行。具体:



First glimpse at Java Concurrent from Executors to FutureTask
            
    
    博客分类: concurrent ExecutorsExecutorServiceFutureTaskCallable 
 今天就写这些,下班了,留给下一次写ThreadPoolExecutor吧。

  • First glimpse at Java Concurrent from Executors to FutureTask
            
    
    博客分类: concurrent ExecutorsExecutorServiceFutureTaskCallable 
  • 大小: 47.8 KB