您如何试图阻止他们?
Thread.stop?警告此方法已弃用。
而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。
下面,使用Thread.interrupt来实现协调。
final Thread subject1 = new Thread(new Runnable() { public void run() { while (!Thread.interrupted()) { Thread.yield(); } System.out.println("subject 1 stopped!"); }});final Thread subject2 = new Thread(new Runnable() { public void run() { while (!Thread.interrupted()) { Thread.yield(); } System.out.println("subject 2 stopped!"); }});final Thread coordinator = new Thread(new Runnable() { public void run() { try { Thread.sleep(500); } catch (InterruptedException ex) { } System.out.println("coordinator stopping!"); subject1.interrupt(); subject2.interrupt(); }});subject1.start();subject2.start();coordinator.start();或者,您也可以使用
volatileboolean(或AtomicBoolean)作为通信方式。
由提供的原子访问,
volatile并
java.util.concurrent.atomic.*允许您确保主题线程可以看到该标志的突变。
final AtomicBoolean running = new AtomicBoolean(true);final ExecutorService subjects = Executors.newFixedThreadPool(2);subjects.submit(new Runnable() { public void run() { while (running.get()) { Thread.yield(); } System.out.println("subject 1 stopped!"); }});subjects.submit(new Runnable() { public void run() { while (running.get()) { Thread.yield(); } System.out.println("subject 2 stopped!"); }});final ScheduledExecutorService coordinator = Executors.newSingleThreadScheduledExecutor();coordinator.schedule(new Runnable() { public void run() { System.out.println("coordinator stopping!"); running.set(false); subjects.shutdown(); coordinator.shutdown(); }}, 500, TimeUnit.MILLISECONDS);同样,您可以选择使用而不是使用
AtomicBoolean,例如:
static volatile boolean running = true;
更好的是,如果您利用ExecutorService,还可以编写类似的代码,如下所示:
final ExecutorService subjects = Executors.newFixedThreadPool(2);subjects.submit(new Runnable() { public void run() { while (!Thread.interrupted()) { Thread.yield(); } System.out.println("subject 1 stopped!"); }});subjects.submit(new Runnable() { public void run() { while (!Thread.interrupted()) { Thread.yield(); } System.out.println("subject 2 stopped!"); }});final ScheduledExecutorService coordinator = Executors.newSingleThreadScheduledExecutor();coordinator.schedule(new Runnable() { public void run() { System.out.println("coordinator stopping!"); subjects.shutdownNow(); coordinator.shutdown(); }}, 500, TimeUnit.MILLISECONDS);这利用了ThreadPoolExecutor.shutdownNow中断其工作线程以试图发出关闭信号这一事实。
运行任何示例,输出应具有以下效果:
C:devscrap>javac CoordinationTest.javaC:devscrap>java CoordinationTestcoordinator stopping!subject 1 stopped!subject 2 stopped!
请注意,最后两行可以任意顺序排列。



