如何阻止使用匿名类创建的线程?

pro*_*eve 5 java multithreading anonymous-types

在我的程序中,我有许多线程处于工作状态,在方法运行中启动或通过从运行调用其他方法.停止这些线程的方法是什么?

线程启动为:

Runnable r = new Runnable() {
   @Override
      public void run() {
         // do something...
      }
};
new Thread(r,"Thread_1").start();
Run Code Online (Sandbox Code Playgroud)

另一个可能是:

Runnable r = new Runnable() {
   @Override
      public void run() {
         startThread(); // another method called
      }
};
new Thread(r,"Thread_2").start();
Run Code Online (Sandbox Code Playgroud)

什么是停止的方法thread_1thread_2

UPDATE

我想要的是当我点击一个按钮时,deactivate后面的3-4个线程应该被取消激活,以便用户可以通过再次分配任务再次启动这些线程.

ska*_*man 6

Thread.stop() 非常危险,强烈建议您避免使用它,原因在于javadoc中所述的原因.

尝试将消息传递给Runnable,也许使用这样的东西:

final AtomicBoolean terminate = new AtomicBoolean(false);

Runnable r = new Runnable() {
   @Override
   public void run() {
      while (!terminate.get()) {
         // do something...
      }
   }
};

new Thread(r,"Thread_1").start();
// some time later...
terminate.set(true);
Run Code Online (Sandbox Code Playgroud)

您必须找到一种方法来确定变量的范围,以便在您的设置下进行编译.或者,Runnable使用您的接口进行扩展,该接口具有cancel()您的匿名类必须实现的方法(或其他),这与循环检查标志类似.

interface CancellableRunnable extends Runnable {
   void cancel();
}
Run Code Online (Sandbox Code Playgroud)
CancellableRunnable r = new CancellableRunnable() {    
   private volatile terminate = false;

   @Override
   public void run() {
      while (!terminate) {
         // do something...
      }
   }

   @Override
   public void cancel() {
      terminate = true;
   }
}

new Thread(r,"Thread_1").start();
// some time later...
r.cancel();
Run Code Online (Sandbox Code Playgroud)


Ale*_*exR 1

Thread 类具有stop()在 java 1.0 中引入并在 java 1.1 中弃用的方法。此方法仍然有效并杀死线程。因此,如果需要,您可以停止所有线程。

但这是非常不推荐的。原因在javadoc中有描述Thread.stop()。因此,最好的解决方案是修复线程的实现,使它们正确退出。但如果这是不可能的(例如,如果这不是您的代码)并且您仍然需要非常多地使用Thread.stop().