java多线程Thread-线程调度类CountDownLatch计数器

来源:互联网 发布:淘宝店装修模板自己做 编辑:程序博客网 时间:2024/06/13 06:52

背景
说起Java,不得不说到他在线程上的优越性,由于封装好了,对于使用者是大大的提升了可读性和理解性。正好我也想记录下关于多线程的基本用法。

相关知识
说到多线程,讲讲它的含义,首先,进程就是正在运行的程序,而一般程序是按照一定顺序执行的,这个执行就称为执行路径/控制单元/线程。 有多种叫法,我只说明下。然而一个CPU一个时间段内只能执行一个进程,所以我们开启大量的程序同时使用的时候,就会出现争夺CPU资源的现象。而根据相应的进程资源调度算法,来进行分配,使得我们的电脑不会停留在执行某个进程,从而无法操作的现象,这个是可以大大的提高CPU的利用率。而多线程,是在执行某个进程的同时,执行相应的其他进程,它的目的,也是为了提高CPU的效率。

详细内容
线程,无非就是Thread类与Runnable接口。而Thread类也是实现了Runnable接口。我这里先不介绍Thread与Runnable的区别,我之后的博文,再详细介绍下它们。我在这里再增加下常用的线程调度类来展开说明线程使用。首先来看看CountDownLatch。

CountDownLatch:
很适合用来将一个任务分为n个独立的部分,等这些部分都完成后继续接下来的任务
隶属于java.util.concurrent包。CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞其他程序。当计数器为0时,则执行其他程序。

我举个例子!
##要装两杯水,有两个水龙头同时进行,一个水龙头5秒装满水,另一个需要7秒。要将两个水杯都装满,才做其他事。那么用Java实现它。
PS:这个我自己编的题目。
那么,根据这个题目,我编码如下:
我先写了个装水的类,用这个类来做装水的动作。代码如下

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();//注意咯!计数器减数咯!
}

}


实现多线程,首先要这个要进行多线程运行的类,需要继承Thread类,然后去重写它的run方法。
那么接下来实现下接水的动作,如下代码:

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("水终于打完了");//因为阻塞通了,所以才执行的这代码
}
}


代码中的注解已经说的很明白了。唯一要注意的就是CountDownLatch创建对象的时候,给的数值要是所执行的线程数量,如果超过了,会产生死锁的。
那么,这篇文章,就先介绍下这个 CountDownLatch计数器。就是拿来将一个部分拆分成多部分来使用的。
0 0
原创粉丝点击