java 协调同步的线程
Example12_8.java
public class Example12_8 {
public static void main(String args[ ]) {
TicketHouse officer = new TicketHouse();
Thread zhangfei,likui;
zhangfei = new Thread(officer);
zhangfei.setName("张飞");
likui = new Thread(officer);
likui.setName("李逵");
zhangfei.start();
likui.start();
}
}
TicketHouse.java
public class TicketHouse implements Runnable {
int fiveAmount=2,tenAmount=0,twentyAmount=0;
public void run() {
if(Thread.currentThread().getName().equals("张飞")) {
saleTicket(20);
}
else if(Thread.currentThread().getName().equals("李逵")) {
saleTicket(5);
}
}
private synchronized void saleTicket(int money) {
if(money==5) { //如果使用该方法的线程传递的参数是5,就不用等待
fiveAmount=fiveAmount+1;
System.out.println( "给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"的钱正好");
}
else if(money==20) {
while(fiveAmount<3) {
try { System.out.println("\n"+Thread.currentThread().getName()+"靠边等...");
wait(); //如果使用该方法的线程传递的参数是20须等待
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
}
catch(InterruptedException e){}
}
fiveAmount=fiveAmount-3;
twentyAmount=twentyAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
}
Bank.java
public class Bank implements Runnable {
int money=200;
public void setMoney(int n) {
money=n;
}
public void run() {
if(Thread.currentThread().getName().equals("会计"))
saveOrTake(300);
else if(Thread.currentThread().getName().equals("出纳"))
saveOrTake(150);;
}
public synchronized void saveOrTake(int amount) { //存取方法
if(Thread.currentThread().getName().equals("会计")) {
for(int i=1;i<=3;i++) {
money=money+amount/3; //每存入amount/3,稍歇一下
System.out.println(Thread.currentThread().getName()+
"存入"+amount/3+",帐上有"+money+"万,休息一会再存");
try { Thread.sleep(1000); //这时出纳仍不能使用saveOrTake方法
}
catch(InterruptedException e){}
}
}
else if(Thread.currentThread().getName().equals("出纳")) {
for(int i=1;i<=3;i++) { //出纳使用存取方法取出60
money=money-amount/3; //每取出amount/3,稍歇一下
System.out.println(Thread.currentThread().getName()+
"取出"+amount/3+"帐上有"+money+"万,休息一会再取");
try { Thread.sleep(1000); //这时会计仍不能使用saveOrTake方法
}
catch(InterruptedException e){}
}
}
}
}
java 协调同步的线程的更多相关文章
- java学习之协调同步的线程
当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合本线程的需要, 那么可以在同步方法中使用wait(),wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权, ...
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...
- Java线程同步和线程通信
一.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步. 不可变类总是线程安全的,因为它的对象状态是不可改变的,但可变类对象需要额外的方法来保证线程安全. 1.同步 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- Java并发编程,互斥同步和线程之间的协作
互斥同步和线程之间的协作 互斥同步 Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLo ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- Java学习笔记之——线程的生命周期、线程同步
一. 线程的生命周期 新建(new Thrad):创建线程后,可以设置各个属性值,即启动前 设置 就绪(Runnable):已经启动,等待CPU调动 运行(Running):正在被CPU调度 阻塞(B ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...
随机推荐
- vs2015打开cshtml文件失败的解决方法
最近不知道为什么,用vs2015打开cshtml识图文件的时候会报错.也不知道是什么原因,google之后得到解决方法如下: Close VS Delete the content of %Local ...
- sqlite 学习
到谷歌上搜sqlite,第一项便是官方网站:www.sqlite.org.进去后,先了解一下大体,感觉还不错. 进入Document页面,大标题SQLite Programming Interface ...
- apicloud ios 打包流程
1创建APP ID 等 2创建pruduction创建证书,用 这个证书导出P12格式的.. 3profile 证书,选 APP STORE AD-HOC ok... http://docs.api ...
- Rational Rose 2003 逆向工程转换C++ / VC++ 6.0源代码成UML类图
目录 1.安装&破解Rational Rose 2003 1.1 安装Rose 2003 1.2 破解Rose 2003 1.3运行出错“没有找到suite objects.dl” 2. Ra ...
- SharePoint 2013 工作流设计之Designer 使用“可视化视图
转载自:http://www.cnblogs.com/jianyus/p/3406309.html SharePoint 2013增强了工作流功能,而Designer里面也添加了可视化设计视图,也就是 ...
- 网页 JavaScript
今天,我主要学习了JavaScript的部分内容. JavaScript在html中的位置主要有三个地方:head里面.body里面.</html>之后,我们一般写在</html&g ...
- hibernate 配置文件
hibernate.cfg.xml </session-factory> //DAO类 package com.hanqi.dao; import org.hibernate.Sessio ...
- yali项目的slider
// 调用 var s41 = new slider({ target : '#slider411', titleActiveClass : 'j-active', itemActiveClass : ...
- yii2图片验证码
控制器LoginController.php <?php namespace backend\controllers; use Yii; use yii\debug\models\search\ ...
- robot framework -重点记录
1.s2l打开的driver和webdriver打开的driver不是同一个driver. rf打开的浏览器.调用的是s2l的driver,而自己的库用的是webdriver的driver,这样在rf ...