鉴于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
我确实理解多线程的想法,但我不确定如何以上述方式实现它。
答案 0 :(得分:2)
使用类似的东西
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;
}
}
}
}
}