java CyclicBarrier (栅栏) 作用是使 指定个数的请求线程互相等待, 拦截在某个公共屏障点(就是栅栏外面)然后全到齐了一起访问这个屏障点的内容
2015-03-19 16:47
363 查看
package test;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Beer {
public static void main(String[] args) {
//设置线程个数
final int count = 5;
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {
@Override
public void run() {
//这里就相当于 一个公共的屏障点---------------------------------------------------------------①
System.out.println("drink beer!");
}
});
// they do not have to start at the same time...
for (int i = 0; i < count; i++) {
new Thread(new Worker(i, barrier)).start();
}
}
}
//线程逻辑处理
class Worker implements Runnable {
final int id;
final CyclicBarrier barrier;
public Worker(final int id, final CyclicBarrier barrier) {
this.id = id;
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(this.id + "starts to run !");
Thread.sleep((long) (Math.random() * 10000));
System.out.println(this.id + "arrived !");
//当线程走到这里时就会在栅栏外面等着。。等其他几个没到栅栏前的线程 直到所有(5个)线程都到达后采取访问①的公共代码
this.barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Beer {
public static void main(String[] args) {
//设置线程个数
final int count = 5;
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {
@Override
public void run() {
//这里就相当于 一个公共的屏障点---------------------------------------------------------------①
System.out.println("drink beer!");
}
});
// they do not have to start at the same time...
for (int i = 0; i < count; i++) {
new Thread(new Worker(i, barrier)).start();
}
}
}
//线程逻辑处理
class Worker implements Runnable {
final int id;
final CyclicBarrier barrier;
public Worker(final int id, final CyclicBarrier barrier) {
this.id = id;
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(this.id + "starts to run !");
Thread.sleep((long) (Math.random() * 10000));
System.out.println(this.id + "arrived !");
//当线程走到这里时就会在栅栏外面等着。。等其他几个没到栅栏前的线程 直到所有(5个)线程都到达后采取访问①的公共代码
this.barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
相关文章推荐
- CyclicBarrier公共屏障点:一个同步辅助类,它允许一组线程互相等待
- restful接口就是url嘛,通过http请求发起访问。那接口进行监控,就可以监控这个restful url嘛
- 一行数学公式,在这个公式里有N个括号,其中各括号可以互相嵌套,请你写一个函数找出指定的第N个括号中的全部内容。
- MFC Activex OCX Javascript 互相访问问题,线程回调javascript
- 完美解决“windows 无法访问指定设备、路径或文件。你可能没有合适的权限访问这个项目”
- 我在delphi中用shellExecute启动了一个程序(ftp);然后想做一个等待,只到ftp进程结束,再继续下面的操作,请问如何监控这个进程是否已结束?
- 实现功能:弹出一个DIV层提示等待信息,这个时候禁用用户操作页面中的其他内容
- Windows无法访问指定设备,路径或文件.您可能没有合适的权限访问这个项目
- 为帮助内容存储区指定的位置无效或者您无权访问该位置
- 做一个WF窗体的启动项,就是让这个程序启动的时候首先会有一个图片出来,然后开始程序
- tcpcopy---研究的就是如何欺骗服务器,让其相信复制的请求就是访问它的
- Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
- 在ASP.NET 2.0中,有时候需要对ASP.NET生成的HTML代码进行处理,或者是保存成静态文件。ASP.NET 提供了直接将请求保存成文件的方法:HttpRequest.SaveAs方法。下面这个方法就是在ASP.NET 2.0中得到ASP.NET
- "为帮助内容存储区指定的位置无效或者您无权访问该位置"解决方法
- 假如想自己写软件的话,可以先FindWindow找到那个窗口的句柄,然后用GetWindowThreadProcessId就可以得到这个窗口的进程ID和线程ID,有了这些ID就可以找到进程名称了。
- "为帮助内容存储区指定的位置无效或者您无权访问该位置"解决方法
- 关于java多线程中同步的问题(两个线程访问同一个实例类的两个同步方法,会不会互相影响)
- iis中应用程序池的作用就是分开进程,让服务器可以同时运行asp.net 1.1和 asp.net 2.0的程序,而互相不干扰。
- Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
- 用线程控制访问请求URL超时问题