繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM