<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">进程(百度百科):</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">进程(</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">Process</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是</span><a target=_blank href="http://baike.baidu.com/view/880.htm" target="_blank" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="color:rgb(19, 110, 194);">操作系统</span></a><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。</span>
线程(百度百科):线程,有时被称为轻量级进程(LightweightProcess,LWP),是程序执行流的最小单元。线程是进程中的一个实体,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
区别与联系:
进程有自己的独立空间,线程只能共享进程中的空间
一个进程中至少包含一个线程
多线程的优点:
1.多线程最大的好处在于可以同时并发执行多个任务,当程序的某个功能部分正在等待某些资源的时候,此时又不愿意因为等待而造成程序暂停,那么就可以创建另外的线程进行其它的工作
2.多线程可以最大限度地减低CPU的闲置时间,从而提高CPU的利用率
JAVA实现:
1. 继承Thread类
public class MyThread extends Thread{<pre name="code" class="java"> //实现run方法
public void run(){
//要做的事情
}
}
2. 实现Runnable接口
public class MyThread implements Runnable{
//实现run方法
public void run(){
//要做的事情
}
}
线程的生命周期:
状态解析:
线程同步:
当多个线程使用同一个资源的时候,资源数据会混乱,所以需要同步数据。
一、引进了同步锁功能:synchronized
Ø synchronized代码块中的语句只能有一个线程在执行
Ø 任意一个对象都有一个标志位,有1和0两种状态
Ø 当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0
Ø 如果是1则执行程序,同是将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0 则线程会阻塞,一直等到对象的标志位为1再执行下面的程序
二、使用生产消费模型:
规则:
生产和消费线程共同操作一个集合,生产线程放入对象,消费线程取出对象!仅当集合中没有对象时,生产线程会放入一个对象,如有集合中有一个对象时,消费线程要马上取出这个对象。
1.wait/notify机制:
在java中,每个对象都有从Object父类继承而来的两个关于线程间通讯的方法wait()和notify(),如其方法名所示,一个是等待,一个是通知,当在一个对象上调用wait()方法时,当前线程就会进行wait状态,直到收到另一个对象的notify()发出通知,才会执行下一步计算
在多线程通讯中,经常会用对象的这两个方法,一个典型的案例就是“生产/消费者模型”
注意:
1)wait和notify必须在同步锁之内使用
2)同步锁锁定对象和wait、notify对象必须同一个
3) 当对象wait挂起状态时候是会释放同步锁的
2. 阻塞队列
LinkedBlockingQueue阻塞队列,阻塞在存放数据时使用了“阻塞”的机制
即当队列中有数据时,对阻塞队列的put()方法将用将会进入等待状态,直到队列中在空间放入数据;
从阻塞队列中取数据时,如果阻塞队列中还没有数据,take()方法就会一直等待,直到队列被放入一个数据对象时,take()方法才会返回这个对象;
定义:
LinkedBlockingQueue<对象> queue = newLinkedBlockingQueue<对象>(集合大小);
例如:
Custmer类:
private ArrayList<IPhone> list;
// 构造方法传递参数方式,初始化list
public Custmer(ArrayList<IPhone> list) {
this.list = list;
}
public void run() {
synchronized (list) {
while (true) {
if(list.size()==0){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//取出一个产品
IPhone iphone = list.remove(0);
System.out.println("消费者购买了一个手机,型号是:"+iphone.getName());
list.notify();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Productor类:
private ArrayList<IPhone> list;
//构造方法传递参数方式,初始化list
public Productor(ArrayList<IPhone> list){
this.list = list;
}
public void run() {
int count = 1;
synchronized (list) {
while(true){
if(list.size()>1){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//生产一个产品
IPhone iphone = new IPhone("IPhone"+count++);
list.add(iphone);
System.out.println("生产商已经生产了一个产品,名字叫:"+iphone.getName());
list.notify();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}