Я пытаюсь найти лучший способ иметь несколько потоков, работающих из одного и того же списка строк. Например, скажем, у меня есть список слов, и я хочу, чтобы несколько потоков работали над печатью каждого слова в этом списке.Несколько потоков, работающих с тем же списком строк, в java?
Вот что я придумал. В потоке используется цикл while, а в то время как итератор следующий, он выводит и удаляет его из списка.
import java.util.*;
public class ThreadsExample {
static Iterator it;
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<>();
list.add("comet");
list.add("planet");
list.add("moon");
list.add("star");
list.add("asteroid");
list.add("rocket");
list.add("spaceship");
list.add("solar");
list.add("quasar");
list.add("blackhole");
it = list.iterator();
//launch three threads
RunIt rit = new RunIt();
rit.runit();
rit.runit();
rit.runit();
}
}
class RunIt implements Runnable {
public void run()
{
while (ThreadsExample.it.hasNext()) {
//Print out and remove string from the list
System.out.println(ThreadsExample.it.next());
ThreadsExample.it.remove();
}
}
public void runit() {
Thread thread = new Thread(new RunIt());
thread.start();
}
}
Это похоже на работу, хотя я получаю некоторые Exception in thread "Thread-2" Exception in thread "Thread-0" java.lang.IllegalStateException
ошибки во время бега:
Исключение в нити Exception "Thread-1" в потоке "Thread-0"
java.lang. IllegalStateException на
java.util.ArrayList $ Itr.remove (ArrayList.java:864) в
RunIt.run (ThreadsExample.java:44) в
java.lang.Thread.run (Thread.java:745) java.lang.IllegalStateException
в java.util.ArrayList $ Itr.remove (ArrayList.java:864) в
RunIt.run (ThreadsExample.java:44) в
java.lang.Thread.run (Thread.java:745)
Я делаю это правильно или есть лучший способ иметь несколько потоков, работающих в одном пуле строк?
Выполнение runnable, которое запускает поток, излишне свернуто. –
Обратите внимание, что использование Iterator.remove() было хорошим началом для начала (это предотвращает обычную [проблему удаления элементов в цикле] (http://stackoverflow.com/questions/223918/iterating-through-a-list -avoiding-ConcurrentModificationException-при удаляющих)). Однако это не одновременный доступ. – Gnoupi
с использованием того же итератора в разных потоках выглядит, ммм, странно. Общий подход заключается в использовании очередей. –