java - 当线程在某个循环中执行长任务时如何中断线程?

标签 java multithreading

可能重复: How do you kill a thread in Java?


我需要通过向线程发送中断信号来停止执行一些大任务。我正在使用 java.util.concurrent.* 中的大部分 API。我的任务被发送到线程并被执行。此任务来自客户端,因此我无法控制该代码。

任务类似于:

public class Task1 extends Thread {
    public void run() {
        while(true){
            if(Thread.interrupted()){
                return;
            }
            for(int i=0; i<Integer.MAX_VALUE; i++){
                System.out.println("I am task 1 " + i);
            }

        }
    }
};

当收到中断信号时,我想基本上停止通过 for 循环循环(请注意,我不能将 Thread.interrputed() 逻辑放在 for 循环中,因为它来自客户端。)我有另一个类使用 Executor 执行此任务。

public class ConcurrentTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    ConcurrentTest test = new ConcurrentTest();
    ExecutorService executorService = Executors.newFixedThreadPool(2);

    Task1 task1 = new Task1();
    Future<?> runningTask1 = executorService.submit(task1);

    Task2 task2 = new Task2();
    Future<?> runningTask2 = executorService.submit(task2);

    //Stop First task after 5 second
    try {
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    runningTask1.cancel(Boolean.TRUE);
    System.out.println("runningTask1.isDone is " + runningTask1.isDone());
    System.out.println("runningTask1.isCancelled is " + runningTask1.isCancelled());
    //Stop Second task after 10 second
    try{
        TimeUnit.SECONDS.sleep(3);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    runningTask2.cancel(Boolean.TRUE);
    System.out.println("runningTask2.isDone is " + runningTask2.isDone());
    System.out.println("runningTask2.isCancelled is " + runningTask2.isCancelled());
}

任务 2 是:

public class Task2 extends Thread{
    public void run() {
        while(true){
            if(Thread.interrupted()){
                return;
            }
            System.out.println("I am task 2");
        }
    }
};

Task2 被中断,但 Task1 永远不会被中断并继续在 for 循环内执行。我不能在客户端代码中放入任何逻辑(类似于 for 循环)。我需要 SO 社区的帮助来解决这个问题。谢谢。

最佳答案

唯一的防爆解决方案是在 Isolate 中运行客户端提供的代码。隔离本质上是一个私有(private)虚拟机,Java 应用程序可以创建、管理它并与之通信。特别是,父应用程序可以安全地终止隔离及其所有线程。

引用:JSR-000121 Application Isolation API Specification - Final Release

问题是找到一个支持 Isolates 的 JVM。

关于java - 当线程在某个循环中执行长任务时如何中断线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1204565/

相关文章:

java - Hibernate 不会在内连接中返回正确的对象

java - 为什么我们必须使用相同的 volatile 字段来使用 volatile 关键字建立 happens-before 关系?

使用 pthreads 在多线程代码中计数器值意外更改

java - 我的 Swing 应用程序可能不是线程安全的 - 虽然不知道为什么

.net - LegacyUnhandledExceptionPolicy 不允许捕获(并吞下)ThreadAbortException?

java - 试图从 Uri Android 读取文本文件

java - 返回包含另一个链表中的键的链表

java - SUN JCE/Oracle JCE 中的默认 RSA 填充

Java:Owasp AntiSamy 与 Owasp-java-html-sanitize

c# - 计时器在禁用后不想再次启动