使用此代码:
final CyclicBarrier gate = new CyclicBarrier(2);
Thread t1 = new Thread() {
public void run() {
try {
gate.await();
for (int i = 0; i < 1000; i++) {
System.out.println("F1:" + i);
}
} catch (InterruptedException | BrokenBarrierException ex) {
Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
Thread t2 = new Thread() {
public void run() {
try {
gate.await();
for (int i = 0; i < 1000; i++) {
System.out.println("F2:" + i);
}
} catch (InterruptedException | BrokenBarrierException ex) {
Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
t1.start();
t2.start();
我能够启动2个线程。现在我需要2个以上的线程,比方说50个。循环中唯一变化的参数是System.out.println("F2:" + i);
作为FX,其中X是线程的编号。
有没有办法让这50个线程进入for循环?
答案 0 :(得分:1)
您可以使用类似
的内容List<Thread> tList = new ArrayList<Thread>();
for(int i = 0; i < 50; i++) {
final int id = i;
tList.add(new Thread() {
public void run() {
try {
gate.await();
for (int k = 0; k < 1000; k++) {
System.out.println("F" + id + ":" + k);
}
}
catch (InterruptedException | BrokenBarrierException ex) {
Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
要启动所有这些,您只需
for(Thread t : tList)
t.start();
如果它真的是关于时间的,也许你的单个线程的代码增加,这将首先初始化所有这些并直接在彼此之后启动它们,所以你不需要考虑你实际需要的时间初始化它们。
答案 1 :(得分:0)
你的意思是,与此相似?
for (int j = 0; j < 50; ++j) {
new Thread() {
public void run() {
try {
gate.await();
for (int i = 0; i < 1000; i++) {
System.out.println("F" + j + ":" + i);
}
} catch (InterruptedException | BrokenBarrierException ex) {
Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
}
}
}.start();
}
答案 2 :(得分:0)
如果您需要同时启动n
个主题,则可以使用Runnable
将Callable
转换为Executors.callable()
,然后使用invokeAll()
ExecutorService
上的方法。
ExecutorService.invokeAll does NOT support collection of runnable task
提供了一个示例