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