我有一个应用程序,它在一个单独的线程中的 while 循环中重复运行某些东西,直到用户触发关闭信号。我可以通过在工作线程中设置一个(易失的)布尔字段来将信号从主线程发送到工作线程,但是有没有其他方法可以关闭/中断线程,例如通过'java.util中的任何实用程序。同时'?
我曾尝试调用 ExecutorService 的 shutdown() 或 shutdownNow() 方法,但它们无法停止工作线程。同样调用shutdown() 并按照此处!Thread.currentThread().isInterrupted()
推荐的在while 条件下使用是无法打破循环。我能找到的唯一另一种方法是使用 CountDownLatch,但在这里我必须在条件 for while 循环中使用,但这种方法的 javadoc 文档说CountDownLatch.getCount() != 0
此方法通常用于调试和测试目的。
这使得它成为 IMO 的一个值得商榷的方法。下面是我的示例代码
class Worker implements Runnable {
//private volatile boolean shutdown = false; --> alternative to countdownlatch
@Override
public void run() {
while (countDownLatch.getCount() != 0) {
//do some work
}
}
}
public class App {
public static void main(String[] args) {
System.out.println("Press enter to stop");
CountDownLatch countDownLatch = new CountDownLatch(1);
ExecutorService es = Executors.newFixedThreadPool(1);
es.execute(new Worker(countDownLatch));
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
System.out.println("Shut down signal received");
countDownLatch.countDown(); //an alternative would be to set a boolean variable in worker
es.shutdownNow();
}
}
还有其他干净的方法吗?