JAVA线程交互

线程的运行都是独立的,但是存在多个线程需要同时访问共享的资源时,需要用到线程的同步(synchronized),就相当于在共享的对象资源上加了一把锁,每次只能一个线程获得对象锁。最简

单的例子:如卖电影票,几个窗口(线程)同时对电影票进行销售,彼此线程都是互斥的,每次只能一个线程去访问电影票(这个对象)。但是也存在一种生产者-消费者的流程,这时需要用到线程的交互(wait()与notify()/notifyAll(),等待-唤醒),比如写个生产包子与卖包子的例子,每次生产包子到100个后就通知去卖包子,当卖包子到0时,就通知生产包子。

1:定义一个包子对象,

public class Manager{

private  int count;//包子的数量

private  String name;//包子的名称

public   int maxcount=100;//包子的最大数量

public    boolean  k;//用于判断包子是否还有,默认是FALSE,用true代表包子有,通知消费,用false代表包子没有,通知生产。

//构造函数

public Manager(String name,int count){

this.name=name;

this.count=count;

}

public int  getCount(){

return this.count;

}

public int setCount(int y){

return this.count+=y;

}

}

//定义一个生产包子的线程

public class Producer implements Runnable{

private Manager ma;//定义一个共享对象

public  Producer(Manager ma){

this.ma=ma;//保证传递进来的是同一个共享对象

}

public void run(){

//因为不知道是生产线程先运行还是消费线程先运行,所以必须先判断

while(true){

//无限循环,保证卖完就生产

synchronized(ma){//传递对象锁

if(ma.k==true){//状态为true,代表包子已经有了,就等待,通知消费。

ma.wait();//这里需要添加try-catch,一旦包子数量有,则需要消费线程去                                            notify(),当前线程就等待唤醒。

}

if(ma.getCount<100){//当包子数量少于100个,就生产

ma.setCount(5);

System.out.println("生产了5个,总量为;"+ma.getCount());

}

ma.k=true;//包子数量大于100个了,所以改变状态

ma.notify();//通知消费者去消费

}

}

}

}

//定义一个消费线程

public class Custer implements Runnable{

private Manager ma;

public Custer(Manager ma){

this.ma=ma;

}

public void run(){

while(true){

synchronized(ma){

if(ma.k==false){

ma.wait();//当包子的状态为false,代表消费需要等待生产。

}

if(ma.getCount()>0){

ma.setCount(-2);

System.out.println("包子已经消费2个,剩下:"+ma.getCount());

}

ma.k=false;//包子已经消费完了,需要生产。

ma.notify();

}

}

}

}

//定义一个主线程类,开始运行

public class Testdemo{

public static void main(String[] args){

Manager ma=new Manager("包子",0);//定义一个包子对象

Producer p=new Producer(ma);//创建生产对象

Custer   c=new Custer(ma);  //创建消费对象

Thread   t1=new Thread(p);//创建生产线程对象

Thread   t2=new Thread(c);   //创建消费线程对象

t1.start();//启动生产线程

t2.start();  //启动消费线程

}

}

时间: 2024-11-10 01:21:41

JAVA线程交互的相关文章

java 线程交互之wait/notify

众所周知java支持多线程,有多线程就必然会存在多线程的交互,交互方式有多种,比如通过共享数据,或者通过提供的锁信号量等等,这里通过用wait以及notify实现线程交互. 要用好线程的wait和notify就要首先了解一下线程的状态,线程的状态大致可以划分为一下几种,创建->就绪->运行->阻塞->销毁 一个线程通过new 到调用start完成了创建到就绪,这个之后就是等待cpu分配资源运行,阻塞的状态是发生在线程运行状态之后,发生线程阻塞的情况有很多种,这里简单的列举一下 1&

Java线程:线程的交互

一.线程交互的基础知识 SCJP所要求的线程交互知识点需要从java.lang.Object的类的三个方法来学习: void notify()           唤醒在此对象监视器上等待的单个线程.  void notifyAll()           唤醒在此对象监视器上等待的所有线程.  void wait()           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法. 当然,wait()还有另外两个重载方法: void w

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

Java线程休眠(sleep)示例

java.lang.Thread的sleep()方法能使当前线程暂停运行一段时间(单位毫秒).需要注意的是,sleep()方法的参数不能为负,否则会抛出IllegalArgumentException异常. 除此之外,还有另一个方法sleep(long millis, int nanos),该方法可用于使当前线程暂停millis毫秒nanos纳秒.需要注意的是,参数nanos的取值范围为[0, 999999]. 下面的代码演示如何用Thread.sleep()方法令主线程暂停执行2秒. Thre

Tomcat学习 HttpConnector和HttpProcessor启动流程和线程交互

一.tomat启动流程 1.启动HttpConnector connector等待连接请求,只负责接受socket请求,具体处理过程交给HttpProcessor处理. tomcat用户只能访问到connector,能设置接受的数据的buffer大小,而不能看见HttpProcessor的处理过程. 2.创建HttpProcessor对象池 创建对象后马上调用start()方法启动processor的线程: private HttpProcessor newProcessor() { HttpP

Java线程池使用说明

Java线程池使用说明 一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少

java线程池原理及实现方式

线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程 为什么要使用线程池 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或"切换过度".为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目. 线程池组成部分 1.线程池管理器(ThreadPoolManager):用于创建并管理线程池,包括 创建线程池,销

java线程详解

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

JAVA线程池中队列与池大小的关系

JAVA线程中对于线程池(ThreadPoolExecutor)中队列,池大小,核心线程的关系写出自己的理解: 1:核心线程:简单来讲就是线程池中能否允许同时并发运行的线程的数量 2:线程池大小:线程池中最多能够容纳的线程的数量. 3:队列:对提交过来的任务的处理模式. 对于线程池与队列的交互有个原则: 如果队列发过来的任务,发现线程池中正在运行的线程的数量小于核心线程,则立即创建新的线程,无需进入队列等待.如果正在运行的线程等于或者大于核心线程,则必须参考提交的任务能否加入队列中去. 1:提交