Java线程:在run()中使用interrupt()是否可以在完成任务时停止线程?

时间:2016-08-03 15:37:38

标签: java multithreading concurrency

我已经设置了Java Thread类,该类预先创建了一个特定的任务,即创建一个新的Process并将其与其他各种东西一起运行。

在调用Thread的父类中,我设置了一个循环

while(!thread.isActive()) {
...
}

我想知道更新run()课程中的Thread以发布interrupt()

是否是最佳做法/可接受的
run() {
  callTask();
  interrupt();
}

更新

然后,我可以在boolean上创建一个finished Thread字段,并在callTask​​()完成并让父查找

后将其更改为true

主题:

run() {
  callTask();
  finished = true;
}

父:

  // Start the threads for each Device
        for (DeviceRunner deviceRunner : deviceRunners) {
            deviceRunner.start();
        }

        boolean doneProcessingDevices = false;
        while (!doneProcessingDevices) {
            Set<DeviceRunner> deviceRunnersToRemove = new HashSet<DeviceRunner>();
            for (DeviceRunner deviceRunner : deviceRunners) {
                if (deviceRunner.isFinishedRunning()) {  // check to see if the thread is finished
                    deviceRunnersToRemove.add(deviceRunner);
                }
            }

            // remove the device runners which are no longer active
            deviceRunners.removeAll(deviceRunnersToRemove);

            if (deviceRunners.isEmpty()) {
                doneProcessingDevices = true;
            }

            Thread.sleep(1000);
        }

谢谢

2 个答案:

答案 0 :(得分:1)

只是为了澄清:您不必手动停止线程。当run()完成时,本机线程将死亡,Thread对象将被垃圾收集。

如果您希望父母等到所有任务完成,您可以使用CountDownLatch。使用必须完成的任务数初始化锁存器。每次任务完成时,让他调用countDown()。在此期间,您的父级会阻止await()

  

导致当前线程等到锁存器倒计数到零,除非该线程为interrupted

这个MWE展示了基本理念:

int numberOfTasks = 3;
CountDownLatch latch = new CountDownLatch(numberOfTasks);

while (numberOfTasks-- > 0) {
    new Thread(() -> {
        try {
            // Do stuff.
            System.out.println("Done.");
        } finally {
            latch.countDown();
        }
    }).start();
}

try {
    latch.await();
    System.out.println("All tasks finished.");
} catch (InterruptedException e) { /* NOP */ }

在每个任务打印All tasks finished.之前,您不会看到Done.

答案 1 :(得分:0)

我相信你真正想要的是Thread.join方法。从Oracle tutorial

复制
  

join方法允许一个线程等待另一个线程的完成。如果t是其线程当前正在执行的Thread对象,t.join()   导致当前线程暂停执行,直到t的线程终止