java - 如何检查线程是否完成了任务?

标签 java multithreading

好的,我创建了几个线程来完成一些复杂的任务。现在我如何检查每个线程是否已成功完成?

class BrokenTasks extends Thread {
     public BrokenTasks(){
       super();
     }
    public void run(){
     //Some complex tasks related to Networking..
     //Example would be fetching some data from the internet and it is not known when can it be finished
      }
      }


    //In another class 
    BrokenTasks task1 = new BrokenTasks();
    BrokenTasks task2 = new BrokenTasks();
    BrokenTasks task3 = new BrokenTasks();
    BrokenTasks task4 = new BrokenTasks();
    task1.start();
    .....
    task4.start();

那么我如何检查这些所有任务是否成功完成 i) 主程序(主线程) ii)从每个连续的线程。例如:检查任务1是否已经从任务2中结束..

最佳答案

使用线程的一个好方法是不直接使用它们。而是创建一个线程池。然后,在 POJO 任务封装中,有一个仅在计算结束时设置的字段。

当另一个线程可以看到状态时,可能会有 3-4 毫秒的延迟 - 但最终 JVM 做到了这一点。只要其他线程不覆盖它就可以了。您可以通过确保每个任务都有一个唯一的要执行的工作实例和状态来保护这一点,并且其他线程仅每 1-5 秒轮询一次,或者拥有工作人员在完成后调用的监听器。 我用过的图书馆是我自己的 https://github.com/tgkprog/ddt/tree/master/DdtUtils/src/main/java/org/s2n/ddt/util/threads

要在服务器启动或静态 block 中使用:

package org.s2n.ddt.util;

import org.apache.log4j.Logger;
import org.junit.Test;

import org.s2n.ddt.util.threads.PoolOptions;
import org.s2n.ddt.util.threads.DdtPools;

public class PoolTest {
    private static final Logger logger = Logger.getLogger(PoolTest.class);

    @Test
    public void test() {
        PoolOptions options = new PoolOptions();
        options.setCoreThreads(2);
        options.setMaxThreads(33);
        DdtPools.initPool("a", options);
        Do1 p = null;
        for (int i = 0; i < 10; i++) {
            p = new Do1();
            DdtPools.offer("a", p);

        }
        LangUtils.sleep(3 + (int) (Math.random() * 3));
        org.junit.Assert.assertNotNull(p);
        org.junit.Assert.assertEquals(Do1.getLs(), 10);
    }

}

class Do1 implements Runnable {
    volatile static long l = 0;

    public Do1() {
        l++;

    }

    public void run() {

        // LangUtils.sleep(1 + (int) (Math.random() * 3));
        System.out.println("hi " + l);
    }

    public static long getLs() {
        return l;
    }
}

你不应该做的事情: * 不要每 10-15 毫秒就做一次事情 * 除非学术界否则不要创建自己的线程 * 不要让它变得比 97% 情况所需的更复杂

关于java - 如何检查线程是否完成了任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855813/

相关文章:

java - getResourceAsStream 上下文初始化

java - Android 绘图尺寸不缩放

java - 致命异常 : main android eclipse

java - 您可以在 Windows 操作系统上使用 Java 进行图标叠加吗

multithreading - IIS 工作线程问题

android - 创建一个在 UI 线程 Android 中更新的秒表

java - 无法在我的测试中注入(inject) Bean(@Spy 注入(inject) bean 的子级)

Android SDK AsyncTask doInBackground 未运行(子类)

java - java 中带有外部 API 对象的线程安全

Python 消费者-生产者。生产者等待消费者消费