我已经设置了Java
Thread
类,该类预先创建了一个特定的任务,即创建一个新的Process
并将其与其他各种东西一起运行。
在调用Thread
的父类中,我设置了一个循环
while(!thread.isActive()) {
...
}
我想知道更新run()
课程中的Thread
以发布interrupt()
run() {
callTask();
interrupt();
}
更新
然后,我可以在boolean
上创建一个finished
Thread
字段,并在callTask()完成并让父查找
主题:
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);
}
谢谢
答案 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的线程终止