CountDownLatch CyclicBarrier 和Semaphore

1.CountDownLatch  

public static void main(String args[]) {
		final CountDownLatch start=new CountDownLatch(1);
		final CountDownLatch end=new CountDownLatch(10);
		
		for(int i=0;i<10;i++) {
			int index=i;
			Thread t=new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					try {
						start.await();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(index+"...");
					end.countDown();
				}
				
			});
			t.start();
		}
		
		System.out.println("start ... ");
		start.countDown();
		try {
			end.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("over ... ");
	}

执行结果

start ... 
0...
5...
4...
3...
1...
2...
6...
8...
9...
7...
over ... 

2.CyclicBarrier 

static CyclicBarrier cb=new CyclicBarrier(3);
	
	public static void main(String args[]) {
		
		for(int i=0;i<3;i++) {
			
			final int a=i;
			Thread t=new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					System.out.println(a+"reached ...");
					
					try {
						cb.await();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (BrokenBarrierException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					System.out.println(a+"over ...");
				}
				
			});
			t.start();
		}
		
	}

执行结果

0reached ...
1reached ...
2reached ...
2over ...
0over ...
1over ...

3.Semaphore

private static final Semaphore semaphore=new Semaphore(3);
	
	public static void main(String args[]) {
		for(int i=0;i<10;i++) {
			final int a=i;
			Thread t=new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					System.out.println(a+"开始排队 ...");
					try {
						semaphore.acquire();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					System.out.println(a+"得到信号 ...");
					
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					System.out.println(a+"释放信号 ...");
					
					semaphore.release();
					
					System.out.println("###################当前可用信号"+semaphore.availablePermits());
				}
				
			}) ;
			
			t.start();
		}
	}

执行结果

1开始排队 ...
0开始排队 ...
2开始排队 ...
3开始排队 ...
0得到信号 ...
1得到信号 ...
2得到信号 ...
5开始排队 ...
7开始排队 ...
6开始排队 ...
9开始排队 ...
8开始排队 ...
4开始排队 ...
1释放信号 ...
0释放信号 ...
###################当前可用信号1
5得到信号 ...
2释放信号 ...
###################当前可用信号1
6得到信号 ...
###################当前可用信号1
3得到信号 ...
5释放信号 ...
3释放信号 ...
7得到信号 ...
9得到信号 ...
6释放信号 ...
###################当前可用信号0
8得到信号 ...
###################当前可用信号1
###################当前可用信号1
8释放信号 ...
###################当前可用信号1
7释放信号 ...
###################当前可用信号1
9释放信号 ...
4得到信号 ...
###################当前可用信号2
4释放信号 ...
###################当前可用信号3

猜你喜欢

转载自blog.csdn.net/caideb/article/details/85710455