001    /*
002     * Copyright 2011 Christian Kumpe http://kumpe.de/christian/java
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package de.kumpe.hadooptimizer.examples.analysis;
017    
018    import java.io.FileNotFoundException;
019    import java.io.PrintWriter;
020    import java.util.Random;
021    import java.util.concurrent.BrokenBarrierException;
022    import java.util.concurrent.CyclicBarrier;
023    
024    public class Polling {
025            private Random random = new Random();
026            private CyclicBarrier barrier = new CyclicBarrier(3);
027            private volatile boolean waitingFinished;
028            private volatile boolean polling3Finished;
029    
030            private class Polling3 extends Thread {
031                    @Override
032                    public void run() {
033                            try {
034                                    barrier.await();
035                                    while (!waitingFinished) {
036                                            Thread.sleep(300 + Math.round(random.nextGaussian()));
037                                    }
038                                    polling3Finished = true;
039                            } catch (final InterruptedException e) {
040                                    e.printStackTrace();
041                            } catch (final BrokenBarrierException e) {
042                                    e.printStackTrace();
043                            }
044                    }
045            }
046    
047            private class Waiting extends Thread {
048                    long sleep;
049    
050                    public Waiting(final long sleep) {
051                            this.sleep = sleep;
052                    }
053    
054                    @Override
055                    public void run() {
056                            try {
057                                    barrier.await();
058                                    Thread.sleep(sleep);
059                                    waitingFinished = true;
060                            } catch (final InterruptedException e) {
061                                    e.printStackTrace();
062                            } catch (final BrokenBarrierException e) {
063                                    e.printStackTrace();
064                            }
065                    }
066            }
067    
068            public Polling() {
069                    try {
070                            final PrintWriter out = new PrintWriter("/tmp/test.out");
071                            for (int time = 0; time < 10000; time++) {
072                                    waitingFinished = false;
073                                    polling3Finished = false;
074                                    new Polling3().start();
075                                    new Waiting(time * time).start();
076                                    barrier.await();
077                                    final long start = System.currentTimeMillis();
078                                    while (!polling3Finished) {
079                                            Thread.sleep(100 + Math.round(random.nextGaussian()));
080                                    }
081                                    final long now = System.currentTimeMillis();
082                                    System.out.printf("Round %d took %dms.%n", time, now - start);
083                                    out.print(time * time);
084                                    out.print('\t');
085                                    out.println(now - start);
086                                    out.flush();
087                            }
088                    } catch (final InterruptedException e) {
089                            e.printStackTrace();
090                    } catch (final BrokenBarrierException e) {
091                            e.printStackTrace();
092                    } catch (final FileNotFoundException e) {
093                            e.printStackTrace();
094                    }
095            }
096    
097            public static void main(final String[] args) {
098                    new Polling();
099            }
100    }