java - 如何停止使用匿名类创建的线程?

标签 java multithreading anonymous-types

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

线程启动为:

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

另一个可能是这样的:

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

停止thread_1thread_2的方法是什么?

更新

我想要的是当我点击一个按钮时 deactivate 后面工作的 3-4 个线程应该被停用,这样用户就可以通过再次分配任务来再次启动这些线程。

最佳答案

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);

您必须想出一种方法来限定变量的范围,以允许它在您的设置下进行编译。或者,使用具有 cancel() 方法(或其他方法)的接口(interface)扩展 Runnable,您的匿名类必须实现该方法,它与循环检查标志。

interface CancellableRunnable extends Runnable {
   void cancel();
}

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();

关于java - 如何停止使用匿名类创建的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464368/

相关文章:

java - 如何使用 jmeter BeanShell 将反斜杠 (\) 替换为正斜杠 (/)

android - Cordova /Phonegap : run FileTransfer plugin in background thread

python - 在pyqt中运行另一个进程时旋转动画

asp.net - 如何从嵌套转发器控件访问 linq group-by 查询的组?

C# 动态构建匿名对象

java - 这在Java中将如何工作?

java - 在 ObjectOutputStream 上频繁调用 reset() 可以吗?

java - 如何以database为参数连接mysql数据库服务器

java - 为什么要在 SynchronizedMap 或 SynchronizedCollections 上同步?

c# - 将匿名类型作为 T 传递