实现多线程,首先要这个要进行多线程运行的类,需要继承Thread类,然后去重写它的run方法。package Thread;
import java.util.concurrent.CountDownLatch;
/**
* 2017-4-6
* author:饶为
* Administrator
*/
public class WaterCountDownLatch extends Thread{//多线程的类要继承Thread类,然后去复写它的run()方法
private int time;
private CountDownLatch cdl;
public WaterCountDownLatch(int time,CountDownLatch cdl){
this.time = time;
this.cdl = cdl;
}
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
public void run() { //重写这个方法,在start()方法中会执行。
// TODO Auto-generated method stub
System.out.println("这个水杯开始装水");
try {
Thread.sleep(time);//让进程停止在这里,相当于是模拟接水
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("这杯水装满了,花了"+time+"毫秒");
cdl.countDown();//注意咯!计数器减数咯!
}
}
package Thread;
import java.util.concurrent.CountDownLatch;
/**
* 2017-4-6
* author:饶为
* Administrator
*/
public class DoWater {
public static void main(String[] args) {
CountDownLatch cdl = new CountDownLatch(2);//这里要说明,执行的是几个线程。//这里不能多写,有几个进程写几个,否则会死锁。因为只执行了两次cdl.countDown()方法,如果填写5, //那么还有3次没有结果,就会一直阻塞在那里。
WaterCountDownLatch wcdlone = new WaterCountDownLatch(5000, cdl);
WaterCountDownLatch wcdltwo = new WaterCountDownLatch(7000, cdl);
wcdlone.start();//进程开始,直接使用start不用调用run方法,否则启动的不是进程
wcdltwo.start();
try {
cdl.await();//阻塞,只有CountDownLatch减完,为0,才会继续。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("水终于打完了");//因为阻塞通了,所以才执行的这代码
}
}