如何停止Java程序的线程?

我用GUI创建了一个java程序,并在其上放置了一个“停止”按钮。 当我启动程序时,主线程启动10个线程。 现在我希望每当用户点击“停止”按钮时,所有线程应首先终止,然后主线程应该终止。 我怎样才能做到这一点。

这取决于你想要10个线程“终止”的方式,以及你如何运行线程。

我建议创建一个ExecutorService ,并将“线程”编写为Runnable实现。 这些Runnable对象应该通过中止其任务,清理并尽快退出run方法来响应对其执行线程的interrupt()调用。

将这些Runnable任务提交给ExecutorService然后在主线程中调用awaitTermination 。 当用户按下“停止”按钮时,在ExecutorService (来自事件调度线程)上根据需要调用shutdownshutdownNow

如果在执行程序服务上调用shutdownNow ,它将通过中断其线程来通知正在运行的任务。 如果您调用shutdown ,它将允许任务完成而不会中断。 无论如何,您的主线程将阻止awaitTermination直到所有任务都完成(或时间限制用完)。

当然,您可以使用join自己创建和管理所有线程。 关键是如果你想要过早地阻止线程,可以使线程中断。

首先,我要注意Thread类上有一个名为stop()的诱人方法。 不要使用它,这是危险的

一种方法是编写10个线程来检查线程的中断状态。

例如

 while (! Thread.interrupted()) { // Do your thread's work } 

您可以通过调用Thread对象上的interrupt()方法来中断每个工作线程,然后调用join()以等待线程实际完成。

给所有线程一个布尔的共享实例,让它们定期检查它是否为true 。 如果true是Thread应该从其run方法返回。 如果用户按下停止按钮然后使用Thread.join()等待所有线程,则将此布尔值设置为true

不推荐使用Thread.stop(),并且建议您使用由Thread定期检查的“running”标志,以便在将该标志设置为false时自行终止。 如果线程有很长的等待阶段,你可以中断()它从wait()状态唤醒它。 – > Thread.stop()int他是Java API doc

通过将运行条件设置为false来终止线程后,您可以按顺序让主线程join()其他线程等待它们的终止。

不推荐使用Thread类上的suspend()和resume()方法,因为它们本身就是未保存的。 查看本文以获取有关它们被弃用的原因以及停止线程的技术的信息:

http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

如果你的线程在InputStream上等待,那么只需在线程中添加一些布尔标志并关闭流。 线程将被唤醒,检查标志并退出。 如果他们在条件(Object.wait())上等待,则使用no​​tifyAll()并设置标志。 如果你的线程不断循环(这是不好的),只需设置标志:)