我有問題。如何在Java代碼中啓動一組線程
我有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的是,做了一些處理,並提出在列表中的Java結果的類:
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代碼中啓動一組線程並檢索可接受的時間?
使用的ExecutorService的一個固定的線程池! :) – 2014-09-30 12:33:50
你能爲我做一個例子嗎? – Musich87 2014-09-30 12:34:58
看看這裏:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html – PeterMmm 2014-09-30 12:35:00