У меня вопрос.Как я могу запустить группу Thread в Java Code
У меня есть 10000 строк, и я хочу выполнить некоторую операцию над каждым из них. Я хотел бы распараллелить эти операции, чтобы сделать общее время выполнения приемлемым.
Я решил создать нить. В частности, каждые 10 строк я запускаю 10 потоков. Для каждого потока я сохраняю результат в списке.
Я пробовал две версии моего кода. Это моя первая версия.
int size = 10000;
int cont = 0;
int n = 1;
String[] arrstr2;
int threadgroup = 10;
if (cont + threadgroup - 1 > size) {
arrstr2[i - cont] = subject.toString();
} else {
arrstr2[i - cont] = subject.toString();
}
if ((i == (threadgroup * n) - 1) || (i == size - 1)) {
cont = i + 1;
n = n + 1;
for (int j = 0; j < arrstr2.length; j++) {
Thread t = new Thread(new MyThread(arrstr2[j], l));
t.start();
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (cont + threadgroup - 1 > size) {
arrstr2 = new String[size - i - 1];
}
}
i = i + 1;
В этой версии я не получаю преимущества в общем исполнении.
Это моя вторая версия:
int size = 10000;
int cont = 0;
int n = 1;
String[] arrstr2;
int threadgroup = 10;
if (cont + threadgroup - 1 > size) {
arrstr2[i - cont] = subject.toString();
} else {
arrstr2[i - cont] = subject.toString();
}
if ((i == (threadgroup * n) - 1) || (i == size - 1)) {
cont = i + 1;
n = n + 1;
for (int j = 0; j < arrstr2.length; j++) {
Thread t = new Thread(new MyThread(arrstr2[j], l));
t.start();
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (cont + threadgroup - 1 > size) {
arrstr2 = new String[size - i - 1];
}
}
i = i + 1;
В этом случае я теряю какую-то информацию. MyThread это класс, который делает некоторую обработку и помещает результат в списке Явы:
public class MyThread implements Runnable{
String subject;
private List<String[]> l;
public MyThread(String subject, List<String[]> l) {
this.subject = subject;
this.l = l;
}
@Override
public void run() {
synchronized (l){
//do something
String[] result = new String[2];
result[0] = res0;
result[1] = res1;
l.add(result);
}
}
Для моей цели, этот код является правильным? Как я могу запустить группу потоков в Java Code и получить приемлемое время?
Используйте ExecutorService с фиксированным бассейном Thread! :) –
Можете ли вы сделать для меня пример? – Musich87
Посмотрите здесь: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html – PeterMmm