Ho una lista che contiene circa 200K elementi.Passaggio di un elenco Iterator a più thread in Java
Sono in grado di passare l'iteratore per questa lista di più thread e li hanno iterare l'intero lotto, senza che nessuno di loro accedono agli stessi elementi?
Questo è quello che sto pensando in questo momento.
principale:
public static void main(String[] args)
{
// Imagine this list has the 200,000 elements.
ArrayList<Integer> list = new ArrayList<Integer>();
// Get the iterator for the list.
Iterator<Integer> i = list.iterator();
// Create MyThread, passing in the iterator for the list.
MyThread threadOne = new MyThread(i);
MyThread threadTwo = new MyThread(i);
MyThread threadThree = new MyThread(i);
// Start the threads.
threadOne.start();
threadTwo.start();
threadThree.start();
}
MyThread:
public class MyThread extends Thread
{
Iterator<Integer> i;
public MyThread(Iterator<Integer> i)
{
this.i = i;
}
public void run()
{
while (this.i.hasNext()) {
Integer num = this.i.next();
// Do something with num here.
}
}
}
mio risultato desiderato è che ogni filo sarebbe elaborare circa 66.000 elementi ciascuno, senza bloccare l'iteratore troppo, e anche senza di i thread che accedono allo stesso elemento.
Questo suono è fattibile?
L'utilizzo di Java 8 'Stream's e' parallel() 'sembra essere il caso d'uso appropriato qui. –
No, non puoi (in sicurezza, con questo codice), perché le chiamate 'hasNext' e' next' non sono atomiche. –
@AndyTurner Con gli stream, l'OP non gestirà manualmente gli iteratori. –