1
public class CyclicBar {
    private final static CyclicBarrier cb = new CyclicBarrier(3,
            new Runnable() {
                @Override
                public void run() {
                    System.out.println("\n-------------");
                }
            });

    public static void main(String[] args) {

        final class ColouredRunnable implements Runnable {
            private int i;

            public ColouredRunnable(int j) {
                this.i = j;
            }

            @Override
            public void run() {
                final String name = Thread.currentThread().getName();
                while (true) {
                    cyclicAwait();
                    for (int i = 0; i < name.length(); i++) {
                        sleep();
//                      System.out.print("" + name.charAt(i) + this.i + " ");
                        System.out.print("" + name.charAt(i) +  " ");
                    }
                }
            }
        }
        ;

        int i = 0;
        new Thread(new ColouredRunnable(i++), "RED").start();
        new Thread(new ColouredRunnable(i++), "BLUE").start();
        new Thread(new ColouredRunnable(i++), "GREEN").start();
    }

    private static int cyclicAwait() {
        try {
            return cb.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return -1;
    }

    private static void sleep() {
        try {
            Thread.sleep(ThreadLocalRandom.current().nextLong(200, 600));
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

上記のコードは現在印刷されています

-------------
G R B R E L E E D U E N 
-------------
B R G E R L U E D E E N 
-------------
R G B E L R E U D E E N 
-------------
R G B E R L U E D E E N 
-------------
B R G E L D R U E E E N 
-------------

上記のコードを変更し、適切な場所に適切なバリアを追加して、次の出力を生成する方法

-------------
R E D B L U E G R E E N 
-------------
R E D B L U E G R E E N 
-------------
R E D B L U E G R E E N 

制約

  • 最新の Java 並行高レベル オブジェクトのいずれかを使用する必要があります
  • 暗黙のロックを使用しないでくださいsynchronised wait notify
  • System.out.print() を使用して個々の文字を出力する必要があります
  • 3 つのスレッドを使用し、各スレッドにはその名前 (色) を印刷する必要があります
  • RED BLUE GREEN の順に印刷する必要があります。
4

3 に答える 3

1

フェイザーを使ってプレイしたい場合は、これも非常にクールです。これに必要なのは、必要な単語をリストに入力することwordsだけです。これにより、各単語のスレッドが作成され、すべてがうまく再生されます。

public class PhaserTest
{
    private final Phaser phaser = new Phaser(1) {
        protected boolean onAdvance(int phase, int parties)
        {
            //Phaser version of your CyclicBarrier Runnable
            if(parties == 1)
                System.out.println("\n-------------");
            return false;
        }
    };

    public void runTest()
    {
        List<String> words = Arrays.asList("RED", "BLUE", "GREEN");

        for(int i = 0; i < words.size();i++)
            new Thread(new ColouredRunnable(words.get(i),i + 1)).start();

        while(phaser.arriveAndAwaitAdvance() != (words.size() + 1)){}
        System.out.println("Done.");
    }

    public class ColouredRunnable implements Runnable {
        private final int order;
        private final String color;

        public ColouredRunnable(String s, int order) {
            this.color = s;
            this.order = order;
            phaser.register();
        }

        @Override
        public void run() {
            while(phaser.arriveAndAwaitAdvance() != order){}

            for (int i = 0; i < color.length(); i++) {
                sleep();
                System.out.print("" + color.charAt(i) +  " ");
            }
            phaser.arriveAndDeregister();
        }

        private void sleep() {
            try {
                Thread.sleep(ThreadLocalRandom.current().nextLong(200, 600));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
于 2013-09-20T01:23:46.447 に答える