Phaser

…衆ロ難τιáo~ 提交于 2019-12-05 00:59:53
/**
 * awaitAdvance方法:如果传入的参数和当前的phase相等,线程就阻塞住等待phase的值增加;否则就立即返回
 */
public class PhaserTest2 {

    private static Random random = new Random(System.currentTimeMillis());

    public static void main(String[] args) throws InterruptedException {
        Phaser phaser = new Phaser(5);
        for (int i = 1; i <= 4; i++) {
            new AwaitAdvanceTask(i, phaser).start();
        }
        int i = phaser.awaitAdvance(phaser.getPhase());
        System.out.println("i = "+i);
    }


    static class AwaitAdvanceTask extends Thread {


        private int no;
        private Phaser phaser;

        AwaitAdvanceTask(int no, Phaser phaser) {
            this.no = no;
            this.phaser = phaser;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(random.nextInt(5000));
                System.out.println(no + " has worked done");
                phaser.arriveAndAwaitAdvance();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


/**
 * 模拟铁人三项运动
 */
public class PhaserTest {

    private static Random random = new Random(System.currentTimeMillis());

    public static void main(String[] args) {

        Phaser phaser = new Phaser(5);
        for (int i = 1; i < 5; i++) {
            new Sportsman(i, phaser).start();
        }
        new InjuredSportsman(5, phaser).start();


    }

    static class InjuredSportsman extends Thread {

        private int no;
        private Phaser phaser;

        InjuredSportsman(int no, Phaser phaser) {
            this.no = no;
            this.phaser = phaser;
        }


        @Override
        public void run() {
            try {
                sport(no, phaser, " starts   running ", " ends   running ");
                sport(no, phaser, " starts   bicycle ", " ends   bicycle");
                System.out.println("I'm injured ,  i will be exit");
                phaser.arriveAndDeregister();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    static class Sportsman extends Thread {

        private int no;
        private Phaser phaser;

        Sportsman(int no, Phaser phaser) {
            this.no = no;
            this.phaser = phaser;
        }


        @Override
        public void run() {
            try {
                sport(no, phaser, " starts   running ", " ends   running ");
                sport(no, phaser, " starts   bicycle ", " ends   bicycle");
                sport(no, phaser, " starts   long  jump  ", " ends   long jump ");

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    private static void sport(int no, Phaser phaser, String s, String s2) throws InterruptedException {
        System.out.println(no + s);
        Thread.sleep(random.nextInt(5000));
        System.out.println(no + s2);
        phaser.arriveAndAwaitAdvance();
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!