1.并发相关类与接口思维导图预览
学习和使用多线程的过程中,遇到很多的类和接口,以下将其整理做概括性描述,具体细节需要可以自行去深入理解学习。
2.知识分点
2.1 Thread(类)
该类在jdk1.0的时候就已经存在,是创建线程的方式之一,它实现了Runnable接口。可以通过继承Thread类,重写run方法来创建一个线程,实现类调用start()方法便可以启动一个新的线程,同样它的构造方法也可以接受一个Runnable类型的参数创建一个线程。
2.2 Runnable(接口)
该接口也是一个顶层接口,只有一个run方法,具体方法源码如下:
public abstract void run();
创建线程的方式之一就是实现该类,重写run方法,将实现类作为参数,传递给Thread的构造方法启动一个新的线程,同样在jdk1.0中就已经出现,
补充:通过继承Thread类型实现的多线程,大多是多个线程去做多件事情。而通过实现Runnale接口的多线程,一般是多个线程去做同一件事情,即将一个实现类交给多个线程去运行
2.3 Callable(接口)
该接口出现于jdk1.5,目的是作为Runnable的替换类,该类支持执行方法call()返回执行结果,而Runnable方法的run()的返回类型为void。接口源码如下:
V call() throws Exception;
2.4 Future(接口)
该接口同样出现在jdk1.5,配合与Callable使用,Callable的作用是产生结果,而Future的作用则是获取结果。并且该接口设计一种新的模式。
2.5 FutureTask(类)
该类直接实现了RunnableFuture接口,间接实现了Runnble和Future接口。因为实现了Runnbale接口,因此其对象可以作为参数被传递给Thread类启动一个线程,作为Future的一个实现类,调用get()方法拿到线程的执行结果。
其构造函数可以接受一个Callable类型的参数。
2.6 Executor(接口)
多线程的顶层接口,仅有一个方法,接受的是Runnable类型的参数,像ThreadPoolExecutor, ExecutorService 等都是继承或实现了该接口。
源码如下:
void execute(Runnable command);
2.7 Executors(类)
该类是一个工具类,通过静态方法可以获取到java自带的几种线程池。
2.8 ExecutorService(接口)
该接口是对Executor接口的扩展,其submit()方法支持接受Callable类型参数,运行后的结果将会返回到Future中,具体方法源码如下:
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
//支持callable集合的传递,将会返回一个Future的list
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
2.9 CompletionService(接口)
该接口仅有一个实现类,该接口作用类似于ExecutorService,但是不同于ExecutorService
2.10 ExecutorCompletionService(类)
该类是上一个接口CompletionService的唯一实现类,总的来说,相对于ExecutorService,该类内部会有一个队列,每当任务提交时,该类会调用Executor进行执行,如果任务执行完毕,其结果future对象便会加入到该队列之中,确保该队列获取到的future对象都是已经完成的,以便于进行后续的工作。但是ExecutorServiece执行完毕的之后的Future有可能只是一个空的壳子,内部线程未执行完毕,这时调用get()方法可能会阻塞,阻碍获取后续已经完成的Future的对象。具体细节实现可以参考以下博文:CompletionService和ExecutorCompletionService详解
以上就是在工作和学习中所接触到一些的并发相关的类和接口,后续学习过程中会不断进行扩展。