Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环屏障Java,如何验证?_Java_Multithreading_Concurrency - Fatal编程技术网

循环屏障Java,如何验证?

循环屏障Java,如何验证?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在准备面试,只想准备一些基本的线程示例和结构,以便在白板编码过程中使用它们 我在读有关CyclicBarrier的文章,只是想尝试一下,所以我写了一个非常简单的代码: import java.util.concurrent.CyclicBarrier; public class Threads { /** * @param args */ public static void main(String[] args) { // *

我正在准备面试,只想准备一些基本的线程示例和结构,以便在白板编码过程中使用它们

我在读有关CyclicBarrier的文章,只是想尝试一下,所以我写了一个非常简单的代码:

import java.util.concurrent.CyclicBarrier;

public class Threads
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // ******************************************************************
        // Using CyclicBarrier to make all threads wait at a point until all
        // threads reach there
        // ******************************************************************
        barrier = new CyclicBarrier(N);

        for (int i = 0; i < N; ++i)
        {
            new Thread(new CyclicBarrierWorker()).start();    
        }
        // ******************************************************************
    }

    static class CyclicBarrierWorker implements Runnable
    {
        public void run()
        {
          try
        {
            long id = Thread.currentThread().getId();
            System.out.println("I am thread " + id + " and I am waiting for my friends to arrive");

            // Do Something in the Thread
            Thread.sleep(1000*(int)(4*Math.random()*10));


            // Now Wait till all the thread reaches this point
            barrier.await();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        //Now do whatever else after all threads are released
        long id1 = Thread.currentThread().getId();
        System.out.println("Thread:"+id1+" We all got released ..hurray!!");
            System.out.println("We all got released ..hurray!!");
        }
    }

    final static int     N       = 4;
    static CyclicBarrier barrier = null;
}
我等了一会儿,希望能看到控制台上依次出现4条语句,然后是“released..hurray”语句的“爆发”。但无论我选择什么作为睡眠,我都看到所有的陈述一起爆发

我是不是遗漏了什么

谢谢
附言:有没有一个像这样的在线编辑器,我可以把Java代码放在那里,然后点击按钮运行一次性代码。我发现有些代码在运行任何代码之前都需要进行一些配置。

代码看起来很好,但在睡觉前写入System.out可能会更有启发性。在运行()中考虑这一点:


在我的机器上,我仍然看到一个突发,但很明显,线程在屏障上被阻塞。

如果要避免第一次突发,请在睡眠中使用随机

Thread.sleep(1000*(int)(8*Math.rand()));
我等了一会儿,希望我 会出现4个语句吗 一个接一个地,一个接一个地 控制台,然后是“爆发” “发布..万岁”声明。但我是 看到所有声明的爆发 无论我选择什么作为 睡眠

我观察到的行为是,所有创建的线程睡眠时间大致相同。记住,其他线程可以在过渡期间执行它们的工作,因此会得到调度;由于所有线程创建睡眠的时间都相同,因此调用System.out.println调用时的时间瞬间差别很小


编辑:将有助于更好地理解屏障的概念,因为它将保证(在某种程度上)多个线程在不同的时刻到达屏障的可能性。

Re:p.S.,FTWps。我已经回答了,但作为参考,我将努力从您的示例中消除静态性。没有什么是绝对错误的,它不会影响你的观察结果,但这将是一个更简单的例子来理解。一旦开始使用“static”,它就会通过code.thnx传播,这有助于验证它!这没有帮助,我使用了:Thread.sleep(1000*(int)(4*Math.random()*10));
        long id = Thread.currentThread().getId();
        System.out.println("I am thread " + id + " and I am waiting for my friends to arrive");
        // Do Something in the Thread
        Thread.sleep(1000*8);
Thread.sleep(1000*(int)(8*Math.rand()));