如何停止Java程序的线程?
我用GUI创建了一个java程序,并在其上放置了一个“停止”按钮。 当我启动程序时,主线程启动10个线程。 现在我希望每当用户点击“停止”按钮时,所有线程应首先终止,然后主线程应该终止。 我怎样才能做到这一点。
这取决于你想要10个线程“终止”的方式,以及你如何运行线程。
我建议创建一个ExecutorService
,并将“线程”编写为Runnable
实现。 这些Runnable
对象应该通过中止其任务,清理并尽快退出run
方法来响应对其执行线程的interrupt()
调用。
将这些Runnable
任务提交给ExecutorService
然后在主线程中调用awaitTermination
。 当用户按下“停止”按钮时,在ExecutorService
(来自事件调度线程)上根据需要调用shutdown
或shutdownNow
。
如果在执行程序服务上调用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())上等待,则使用notifyAll()并设置标志。 如果你的线程不断循环(这是不好的),只需设置标志:)