美文网首页
Java线程池(三)

Java线程池(三)

作者: 高默思 | 来源:发表于2019-03-11 16:17 被阅读0次

接下来三篇文章主要围绕Java线程池的三个方面进行编写

第一个方面Exectutor,该类是Java线程池的顶层抽象类

第二个方面:讲述Java线程池中的各种线程池

第三个方面:讲述Future和FutureTask,线程的返回结果处理类

如何获取线程中的运算结果?

1:使用全局变量,将线程中的结果赋值给全局变量

2:使用concurrent包中的队列,使用生产者-消费者模式获取线程中的结果

3:使用Future或者FutureTask阻塞获取线程结果

Future

Future是获取任务结果和取消任务的顶层接口

get():获取任务执行结果,在获取结果之前,该任务阻塞,直到获取结果

get(long,TimeUnit):和get()方法相同,不过设置了超时时间,在超时时间内没有获取结果将阻塞,超过超时时间返回TimeoutException异常

cancel(boolean):尝试取消一个任务

    1):如果任务没有开启,则该任务将永远不会执行

    2):如果任务正在执行,则通过boolean确定执行该任务的线程是否应该在试图停止该任务时被中断。

    3):如果任务已经完成。则取消。

isCancelled():如果任务在正常完成前取消该任务,该方法返回true;

isDone():如果任务正常完成,返回true

FutureTask

FutureTask:是Future的实现类,并且继承了Runable接口

调用run()方法执行该任务

当一个Runnable或者Callable提交给FutureTask的时候。FutureTask存在以下几种状态

1)未启动。FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态。当创建一个FutureTask,且没有执行FutureTask.run()方法之前,这个FutureTask处于未启动状态。

2)已启动。FutureTask.run()方法被执行的过程中,FutureTask处于已启动状态。

3)已完成。FutureTask.run()方法执行完后正常结束,或被取消(FutureTask.cancel(…)),或执行FutureTask.run()方法时抛出异常而异常结束,FutureTask处于已完成状态。

FutureTask的状态迁移示意图

当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞;

当FutureTask处于已完成状态时,执行FutureTask.get()方法将导致调用线程立即返回结果或抛出异常。

当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将导致此任务永远不会被执行;

当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断执行此任务线程的方式来试图停止任务;

当FutureTask处于已启动状态时,执行FutureTask.cancel(false)方法将不会对正在执行此任务的线程产生影响(让正在执行的任务运行完成);当FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false。

实例1

Callable提交给线程池,获取结果

结果

实例2

单独一个Callable提交给FutureTask获取结果

结果

相关文章

网友评论

      本文标题:Java线程池(三)

      本文链接:https://www.haomeiwen.com/subject/uwlbpqtx.html