同时运行几个方法,但按顺序

时间:2014-01-02 19:00:29

标签: java multithreading

鉴于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

我确实理解多线程的想法,但我不确定如何以上述方式实现它。

1 个答案:

答案 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;
                }
            }
        }
    }

}