JDK.CountDownLatch 浅析

下边这段代码,会输出什么?

package com.test.java;

import java.util.concurrent.CountDownLatch;

class MyThread implements Runnable{
	
	private String name;

	public MyThread(){}
	
	public MyThread(String name){this.name = name;}

	@Override
	public void run() {
	    for (int i = 0; i < 10; i++) {
			System.out.println(name + i + " ... ");
		}	
	}
}

public class TestConcurrent2 {
    public static void main(String[] args) {
		Thread t = new Thread(new MyThread("beckham"));
		t.start();
		
		Thread tk = new Thread(new MyThread("kaka"));
	    tk.start();
	}
}


 

 

答案是不确定。有可能先输出kaka,也有可能先输出beckham。

但是如果我稍微变一下...

package com.test.java;

import java.util.concurrent.CountDownLatch;

class MyThread implements Runnable{
	
	private String name;

	public MyThread(){}
	
	public MyThread(String name){this.name = name;}

	@Override
	public void run() {
	    for (int i = 0; i < 10; i++) {
	    	if(name.equals("beckham")){
	    		try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    	}
			System.out.println(name + i + " ... ");
		}	
	}
}

public class TestConcurrent2 {
    public static void main(String[] args) {
		Thread t = new Thread(new MyThread("beckham"));
		t.start();
		
		Thread tk = new Thread(new MyThread("kaka"));
	    tk.start();
	}
}

对的,这下不出意外的话,你答对了,先输出kaka。

但是实际工作中有这样的情况。一段代码有AB两块,A启动了一个线程,B也启动了一个线程。如何保证A完成之后,B线程才开始?(sleep是很糟糕的做法,而且不能保证)

 

OK, Concurrent包提供的CountDownLatch就是这样一个工具,我对第二段代码继续改造一下 ...

 

package com.test.java;

import java.util.concurrent.CountDownLatch;

class MyThread implements Runnable{
	
	private String name;
	
	private CountDownLatch end = new CountDownLatch(10);
	
	public MyThread(){}
	
	public MyThread(String name){this.name = name;}
	
	public MyThread(String name, CountDownLatch end) {
		this.name = name;
		this.end = end;
	}

	@Override
	public void run() {
	    for (int i = 0; i < 10; i++) {
	    	if(name.equals("beckham")){
	    		try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally{
					end.countDown();
				}
	    	}
			System.out.println(name + i + " ... ");
		}	
	}
}

public class TestConcurrent2 {
    public static void main(String[] args) {
    	CountDownLatch end = new CountDownLatch(10);
    	
		Thread t = new Thread(new MyThread("beckham", end));
		t.start();
		
		try {
			end.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally{			
			Thread tk = new Thread(new MyThread("kaka"));
			tk.start();
		}

	}
}

CountDownLatch就是一个简单的计数器用来约束线程。直到计数器为0. 才肯放行下边的工作 ....XD
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值