Недопустимое исключение состояния потока при запуске потока - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать 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--;
    }
}

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Если List_of_FileContentsLists.size()> 1, вы получите IllegalThreadStateException

Например, саке, предположим, что List_of_FileContentsLists.size() = 2 и worker1.busy = false.

Когда nextTask равно 0, вы начали поток с 0 <2. </p>

Во второй итерации nextTask равен 1 и все еще 1 <2. </p>

Согласно вашей логике, вы пытаетесь start() поток,который уже начался.

start ()

Заставляет этот поток начать выполнение;виртуальная машина Java вызывает метод run этого потока.

Запрещается запускать поток более одного раза.В частности, поток не может быть перезапущен после завершения выполнения.

Предложения:

  1. Не вызывать метод start() более одного раза.Измените ваш цикл for соответственно.

  2. Запустите ExecutorService и отправьте задачу Runnable или Callable в ExecutorService.

0 голосов
/ 10 мая 2018

Для каждого работника, которого вы запускаете один раз, вы не можете запустить его несколько раз, как это было в цикле.Я надеюсь, что WorkerN обозначает разные потоки.

IllegalThreadState возникает, когда вы пытаетесь изменить состояние потока на недопустимое состояние.Для получения дополнительной информации, перейдите через Javadoc:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...