一般而言,执行此操作的方法是让每个其他线程定期检查标志。后台线程经常循环,等待工作-
每次循环时,它们只需要检查标志即可。如果他们正在使用
Object.wait()或类似的东西被告知还有更多工作要做,则应使用相同的通知来指示线程也应停止。(不要只是旋转,直到您停止-
这会占用CPU。不要只是使用sleep-这会延迟终止。)
这样一来,所有线程便可以干净地终止,从而适当地释放资源。IMO
interrupt()和其他选项(例如和不赞成使用的
destroy()方法)很难进行正确控制。(中断线程比硬终止线程更好,但是线程有其自身的一系列问题-
例如,无论如何,仅在某些点处理中断。)
编辑:在代码中,它将类似于:
// Client prefor (Task task : tasks) { task.stop();}// Threading prepublic abstract class Task implements Runnable { private volatile boolean stopped = false; public void stop() { stopped = true; } protected boolean shouldStop() { return stopped; } public abstract void run();}然后,您的任务将成为子类
Task。如果您希望该
stop()方法还可以通知监视器,则需要使其稍微复杂一些,但这是基本思想。
示例任务:
public class Sometask extends Task { public void run() { while (!shouldStop()) { // Do work } }}


