java - 如何解决这种多任务场景中任务长时间中断的问题?

标签 java multithreading

好吧,我在面试中被问到了这个多线程问题。问题是这样的

public class Job {

    static boolean interruptTask = false;

    private static class Mytask extends Thread{
        @Override
        public void run() {
            while(!interruptTask){
                //do some time consuming thing until interruption like looping over millions of times

            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Mytask t = new Mytask();
        t.run();
        Thread.sleep(1000);
        interruptTask=true;
        t.join();
        System.out.println("end");
    }
}

问题陈述

此代码片段有什么问题以及您将如何修复它。

我能够在这里找出问题所在。我认为问题在于,即使我们在主函数中将interrupttask变量设置为true,它也不会中断线程。该线程将继续执行,直到其长时间执行尚未结束。

但是我不知道这个问题的解决方案?我的意思是,我们有线程的等待、通知等工具,但我不知道我们可以在这里使用这些工具。在这种情况下应该采取什么方法来解决这个特定问题?

谁能帮我解决这个问题吗?或者关于我应该如何寻求解决方案的一些指导?

最佳答案

有两个问题:

  1. t.run() 应为 t.start()。否则,您将在单线程中执行这两项任务。

  2. interruptTask应该是 volatile 或者应该通过synchronized getter/setter来访问。否则,Java 可以假设只有一个线程正在使用该字段并进行优化:

    while(!interruptTask){
        // something
    }
    

    进入:

    if(!interruptTask){
        while(true){
            // something
        }
    }
    

关于java - 如何解决这种多任务场景中任务长时间中断的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471810/

相关文章:

java - 使用compareTo 方法按字母顺序对ArrayList 中的新条目进行排序

java - startActivityForResult 包含三个 Activity

java - JSON 文件中的 Jackson 日期反序列化错误

java - Jackson 映射缺少一个键值来映射 POJO 类

java - 将命令行参数传递给Jetty的start.jar

c++ - 向不存在的窗口发送消息好吗?

iphone - 帮助 iOS 上的多线程?

Python 线程安全访问不会阻塞或不受控制的队列增长?

javascript - JavaScript 中的多线程或异步代码如何工作?