多线程获取任务状态的两种方式
Posted 孙晓凯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程获取任务状态的两种方式相关的知识,希望对你有一定的参考价值。
问题描述
比如现在有两个线程:1,主线程 2,工作线程
那么如何知道开启的工作线程的执行状态呢?
第一种方式如下:
public static void main(String[] args)
TestThreadStatus testThreadStatus = new TestThreadStatus();
testThreadStatus.runTask();
private void runTask()
ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(3);
Future<?> submit = newCachedThreadPool.submit(new TaskThread());
if (submit.isDone())
System.out.println("done-------------");
class TaskThread implements Runnable
@Override
public void run()
System.out.println("I am task thread !");
这种方式利用了Future接口中的isDone()方法,该方法可以判断一个自线程是否结束,但是该方法是一种颗粒度非常大的方法,并不是说只有工作线程正常完成了工作才返回true,具体看官方文档如下:
boolean isDone()
Returns true if this task completed. Completion may be due to normal termination, an exception, or cancellation – in all of these cases, this method will return true.
Returns:
true if this task completed
第二种方式—回调,代码如下:
//定义回调接口
public interface ICallBack
public String getData();
public String getError();
public class CallBackImpl implements ICallBack
@Override
public String getData()
return "data";
@Override
public String getError()
return "error";
public class TestThreadStatus
public static void main(String[] args)
TestThreadStatus testThreadStatus = new TestThreadStatus();
testThreadStatus.runTask();
private void runTask()
ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(3);
ICallBack callBack = new CallBackImpl();
Future<?> submit = newCachedThreadPool.submit(new TaskThread(callBack));
class TaskThread implements Runnable
private ICallBack callBack;
public TaskThread(ICallBack callBack)
this.callBack = callBack;
@Override
public void run()
System.out.println("I am task thread !");
//当工作线程结束后调用回调函数,通知主线程
System.out.println(callBack.getData());
总结:A线程获取B线程的工作状态有两种方式:1,future 2,回调函数
方式一:实现简单,Java包提供了封装,但是颗粒度大。最重要的是需要主动拉数据。
方式二:需要自己设计回调接口,颗粒度小,使用灵活。主动推送数据。
两种方式没有好坏之分,可以根据不同的应用场景选择不同的实现方式。
以上是关于多线程获取任务状态的两种方式的主要内容,如果未能解决你的问题,请参考以下文章
Python36 1.joinablequeue 2.线程理论 3.多线程对比多进程 4.线程的使用方式 4.1.产生 线程的两种方式 4.2.守护线程 4.3.线程安全问题 4.3.1.互斥锁 4