【问题标题】:Illegal Thread State Exception when starting a thread启动线程时出现非法线程状态异常
【发布时间】:2018-05-10 15:58:56
【问题描述】:

我正在尝试创建 4 个线程并给它们分配任务。但是我不断收到 IllegalThreadStateException。我在这里潜伏了一些问题,但似乎没有一个对我有帮助。 这是关键的代码片段:

Sorter worker1 = new Sorter(theView,1);
Sorter worker2 = new Sorter(theView,2);
Sorter worker3 = new Sorter(theView,3);
Sorter worker4 = new Sorter(theView,4);

for(int nextTask=0 ; nextTask<List_of_FileContentsLists.size() ; nextTask++){
    if(worker1.busy == false){
        worker1.acquireTask(List_of_FileContentsLists.get(nextTask),fileList[nextTask]);
        worker1.start();
    }
    else if(worker2.busy == false){
        worker2.acquireTask(List_of_FileContentsLists.get(nextTask),fileList[nextTask]);
        worker2.start();
    }
    else if(worker3.busy == false){
        worker3.acquireTask(List_of_FileContentsLists.get(nextTask),fileList[nextTask]);
        worker3.start();
    }
    else if(worker4.busy == false){
        worker4.acquireTask(List_of_FileContentsLists.get(nextTask),fileList[nextTask]);
        worker4.start();
    }
    else{
        nextTask--;
    }
}

提前致谢!

【问题讨论】:

标签: java multithreading exception state


【解决方案1】:

对于您启动一次的每个工作器,您不能像通过循环那样重复启动它。我希望 WorkerN 代表不同的线程。

当您尝试将线程的状态更改为不允许的状态时,会出现 IllegalThreadState。如需更多参考,请浏览 javadoc:

https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalThreadStateException.html

【讨论】:

    【解决方案2】:

    如果List_of_FileContentsLists.size() > 1,你将得到IllegalThreadStateException

    例如,假设List_of_FileContentsLists.size() = 2 和worker1.busy = false

    nextTask为0时,你从0

    在第二次迭代中,nextTask 为 1,但仍为 1

    根据您的逻辑,您尝试start() 一个线程,该线程已经启动。

    start()

    使该线程开始执行; Java虚拟机调用该线程的run方法。

    多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

    建议:

    1. 不要多次调用start() 方法。相应地更改您的 for 循环。

    2. 启动ExecutorService 并将RunnableCallable 任务发布到ExecutorService

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2021-11-04
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多