多线程获取任务状态的两种方式

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包提供了封装,但是颗粒度大。最重要的是需要主动拉数据。
方式二:需要自己设计回调接口,颗粒度小,使用灵活。主动推送数据。

两种方式没有好坏之分,可以根据不同的应用场景选择不同的实现方式。

以上是关于多线程获取任务状态的两种方式的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程——创建线程的两种方式

关于多线程的两种创建方式的用法和选择

多进程之开启进程的两种方式

开启进程的两种方式

1-2 开启进程的两种方式

Python36 1.joinablequeue 2.线程理论 3.多线程对比多进程 4.线程的使用方式 4.1.产生 线程的两种方式 4.2.守护线程 4.3.线程安全问题 4.3.1.互斥锁 4