线程

<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>

线程(百度百科):线程,有时被称为轻量级进程(LightweightProcessLWP),是程序执行流的最小单元。线程是进程中的一个实体,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派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();
				}
			}
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值