[英]Run several methods concurrently but in order
给定3个方法method1()
, method2()
和method3()
,同时运行它们的最简单方法是什么? (示例代码将非常感谢)
private void method1(){
for(int x=0; x <= 5; x++){
System.out.println("method 1: " + x);
}
}
private void method2(){
for(int x=0; x <= 5; x++){
System.out.println("method 2: " + x);
}
}
private void method3(){
for(int x=0; x <= 5; x++){
System.out.println("method 3: " + x);
}
}
我想同时运行它们,但输出应该如下:
method 1: 1
method 2: 1
method 3: 1
method 1: 2
method 2: 2
method 3: 2
method 1: 3
method 2: 3
method 3: 3
method 1: 4
method 2: 4
method 3: 4
method 1: 5
method 2: 5
method 3: 5
我确实理解多线程的想法,但我不确定如何以上述方式实现它。
使用这样的东西
new Thread(new Runnable() { public void run() { method1()} }).start();
三次。
但请注意,这并不一定会使它们并行运行,因为无法保证不同线程何时实际运行。
如果你想在java中同时开始编程,我可以推荐这本书: http : //jcip.net.s3-website-us-east-1.amazonaws.com/
编辑:以下是使用CyclicBarrier的完整示例,它有点像您期望的那样。 但是,仍然无法保证各个线程的运行顺序。 唯一可以保证的是按顺序打印数字。
您基本上告诉CyclicBarrier涉及多少方(即线程),然后每个方运行到await方法。 await方法阻塞线程,直到先前指定的线程数量处于阻塞状态。 只有这样,该方法才会返回(即for循环中的下一次迭代)。
public class SyncAccessTest {
public static void main(String args[]) {
int parties = 3;
int nprints = 3;
CyclicBarrier barrier = new CyclicBarrier(parties);
for (int i = 0; i < parties; i++) {
new Thread(new Counter(barrier, nprints)).start();
}
}
private static class Counter implements Runnable {
private final CyclicBarrier barrier;
private final int max;
public Counter(CyclicBarrier barrier, int max) {
this.barrier = barrier;
this.max = max;
}
@Override
public void run() {
for (int i = 1; i <= max; i++) {
System.out.println(Thread.currentThread().getId() + ": " + i);
try {
barrier.await();
} catch (InterruptedException ie ) {
return;
} catch (BrokenBarrierException bbe) {
return;
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.