b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

CyclicBarrier与CountDownLatch、栅栏与计数器

电脑杂谈  发布时间:2016-04-16 19:06:33  来源:网络整理

你是否正在寻找关于cyclicbarrier的内容?让我把最受欢迎的东西奉献给你:

C_J 写道

    在多线程设计中,我猜常常会遇到线程间相互等待以及某个线程等待1个或多个线程的场景,比如多线程精密计算和大量数据处理,这里写下我自己的体会和理解,。

   

    我想应该有很多办法,如果是简单的1:1关系,那么可以wait()和notify()解决,就像一把锁和一把钥匙;如果是1:N关系,这个1就需要关心N的所有状态了,最笨的办法是1可以去查看N当前的状态,轮询询问工作是否做完。而好点的办法是N做完后主动告诉1,然后N就会有2种选择,要么听从1的命令,要么继续干自己其他的活。

 

    用传统的方法我想应该是都能实现的,而JDK1.5提供了cyclicbarrier与CountDownLatch来解决了这两个问题,而她们的区别是:

    cyclicbarrier使所有线程相互等待,而CountDownLatch使一个或多个线程等待其他线程。区别类似上面蓝色字体,CountDownLatch不会等待其他线程了,只要做完自己的工作就干自己的活去了,也就是run()方法里其他的任务。

 

Example:

public static void testCountDownLatch() throws InterruptedException{   CountDownLatch cdl=new CountDownLatch(2);   ExecutorService exe=Executors.newFixedThreadPool(2);    class Bow implements  Runnable{     CountDownLatch cdl;     public Bow(CountDownLatch cdl){     this.cdl=cdl;      }     public void run(){      System.out.println("The bow is coming");      System.out.println("kick a bow ");      this.cdl.countDown();      System.out.println("do other thing");      }    }   exe.execute(new Bow(cdl));   exe.execute(new Bow(cdl));   exe.shutdown();   System.out.println("Wait...");     cdl.await();     System.out.println("End..");    } public static void main(String[] args) { try { Test.testCountDownLatch(); } catch (InterruptedException e) { } }

 

输出的结果为:

 

The bow is coming
kick a bow
do other thing
Wait...
The bow is coming
kick a bow
do other thing
End..

 

如上所说do other thing不受影响。

 

写了一个cyclicbarrier的例子:

public static void testCyclicBarrier() throws InterruptedException, BrokenBarrierException{ CyclicBarrier barr=new CyclicBarrier(2+1); ExecutorService exe=Executors.newFixedThreadPool(2); class Bow implements Runnable{ CyclicBarrier barr; public Bow(CyclicBarrier barr){ this.barr=barr; } public void run(){ System.out.println("The bow is coming"); System.out.println("kick a down"); try { barr.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("do other thing"); } } exe.execute(new Bow(barr)); exe.execute(new Bow(barr)); exe.shutdown(); System.out.println("Wait..."); barr.await(); System.out.println("End.."); } public static void main(String[] args) { try { Test.testcyclicbarrier(); } catch (InterruptedException e) { } catch (BrokenBarrierException e) { } }

 

输出结果为:

 

Wait...
The bow is coming
kick a down
The bow is coming
kick a down
do other thing
End..
do other thing

 

总结:

我们看到do other thing被阻塞了,直到最后才执行,可见,栅栏和计数器的目完全不同了。向Doug Lea牛人学习:)

 

 

 

 

 

 


我复制了你的第二部分程序代码(cyclicbarrier部分),经过测试执行,每次结果都不一样。其中也会出现你列在下面的输出。

-------------------------------------------------------------

The bow is coming

kick a down

Wait...

The bow is coming

kick a down

do other thing

do other thing

End..

-------------------------------------------------------------

Wait...

The bow is coming

kick a down

The bow is coming

kick a down

End..

do other thing

do other thing

-------------------------------------------------------------

Wait...

The bow is coming

kick a down

The bow is coming

kick a down

do other thing

End..

do other thing

-------------------------------------------------------------

以上就是关于cyclicbarrier的全部内容,相信你一定会非常满意。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-1436-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 奕詝
        奕詝

      • 栾红丽
        栾红丽

        是否落后你也并不清楚

        • 郭文举
          郭文举

          甚至是扶持恐怖组织

      • 杜勇
        杜勇

        一个浙江财经学院教授在研究问题时就只有一个3000万的推测数据吗

      热点图片
      拼命载入中...