java学习之协调同步的线程
当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合本线程的需要,
那么可以在同步方法中使用wait(),wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
其他线程如果在使用这个同步方法时,不许需要等待,那么它使用这个同步方法。其他线程如果再使用这个同步方法是不需要等待,那么它使用完
这个同步方法的同时,应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待.曾中断的线程就会从刚才的中断处继续执行
这个同步方法.....
/*
wait();
notify();
notifyAll();
*/
在下面的列子中:
/*
张飞和李逵买电影票。售票员只有两张5元的钱,电影票5元一张。张飞
拿20元一张的人民币排在李逵的前面买票,李逵拿一张5元的人民币买票,因此张飞必须等待。
*/
//package Scan_boobs;
public class Example12_8 extends window_scan
{
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();
}
} class TicketHouse implements Runnable
{
int fiveAmount=2,tenAmount=0,twentyAmount=0;
@Override
public void run() {
// TODO Auto-generated method stub
String name=Thread.currentThread().getName();
if(name.equals("张飞")) saleTicket(20);
else saleTicket(5); }
private synchronized void saleTicket(int money)
{
if(money==5)
{
fiveAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
+Thread.currentThread().getName()+"的钱正好");
}
else if(money==20)
{
while(fiveAmount<3)
{
try {
this.out("\n"+Thread.currentThread().getName()+"靠边等....");
wait();
// Thread.sleep(3000);
this.out("\n"+Thread.currentThread().getName()+"继续买票");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
fiveAmount-=3;
twentyAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷,"
+Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
private void out(String name)
{
System.out.println(name);
}
}

需要特别注意:
/*
在许多实际的问题中wait方法应当放在一个"while(等待的条件){}"的循环语句中,而不是“if(等待条件){}的分支语句中”
*/
如果咸的蛋疼了,将wait(); ----》改为 Thread.sleep(); 然后呵呵,你会就会这样 
代码:
package Scan_boobs;
public class Example12_8 extends window_scan
{
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();
}
} class TicketHouse implements Runnable
{
int fiveAmount=2,tenAmount=0,twentyAmount=0;
@Override
public void run() {
// TODO Auto-generated method stub
String name=Thread.currentThread().getName();
if(name.equals("张飞")) saleTicket(20);
else saleTicket(5); }
private synchronized void saleTicket(int money)
{
if(money==5)
{
fiveAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
+Thread.currentThread().getName()+"的钱正好");
}
else if(money==20)
{
while(fiveAmount<3)
{
try {
this.out("\n"+Thread.currentThread().getName()+"靠边等....");
wait();
// Thread.sleep(3000);
this.out("\n"+Thread.currentThread().getName()+"继续买票");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
fiveAmount-=3;
twentyAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷,"
+Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
private void out(String name)
{
System.out.println(name);
}
}
效果图:

java学习之协调同步的线程的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java 学习 进阶之 一 (线程基础)
一.线程安全 线程安全的概念:当多个线程访问某一个类(对象或方法)时.这个类始终都能表现出正确的行为那么这个类(对象或方法)就是线程安全的. synchronized:可以在任何对象及方法上加锁,而加 ...
- java 协调同步的线程
Example12_8.java public class Example12_8 { public static void main(String args[ ]) { TicketHouse of ...
- Java学习笔记-基础语法Ⅹ-进程线程
学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...
- 《java学习三》并发编程 -------线程池原理剖析
阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...
- Java 学习笔记之 Stop停止线程
Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...
- Java 学习笔记之 Return停止线程
Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...
- Java 学习笔记之 Sleep停止线程
Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...
- 20165223《Java程序设计》第八周Java学习总结
教材学习内容总结 第12章-JAVA多线程机制 要点 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 教材学习中的问题和解决过 ...
随机推荐
- 【Unity3D游戏开发】定制新建C#文件的头描述 (三三)
unity添加新脚本的时候,可以定制[开发者姓名][开发日期][文件描述][版权声明]等,省的到时候不知道谁写的,也没有个描述,关键是TNND连个背锅的人都没有 其实unity已经给我们提供了新建脚本 ...
- Freebie - Utility Form: Generate Excel Report From SQL Query In Oracle Forms 6i And 11g
Sharing a form to generate Excel file report from SQL query in Oracle Forms. This form can be used i ...
- jQuery 预习视频
1.事件补充 <input type="button" onclick="CheckAll('#edit_mode','#tb1');" value=&q ...
- STORM_0007_Multi-Lang protocol of Storm/多语言协议的翻译
原始地址: http://storm.apache.org/releases/1.0.1/Multilang-protocol.html 这个协议试用0.7.1之后的版本 通过ShellBolt和 ...
- hdu 5023 A Corrupt Mayor's Performance Art 线段树
A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100 ...
- C#垃圾回收机制(GC)
GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...
- git原理图解
本文背景,在实际项目中使用git已有一年,发现不少同事虽然会使用常用git指令,但并不理解每个指令对应的作用原理.今天静下心总结下git 的基本理解:代码的存在区域:本文以实际项目出发,理清使用git ...
- 对sizeof的思考
一.sizeof的特点(与strlen比较) 1.sizeof是运算符,strlen是函数,这意味着编译程序在编译的时候就把sizeof计算过了,所以sizeof(x)可以用来定义数组维数. 例如 i ...
- java实现excel与mysql的导入导出
注意:编码前先导入poi相关jar包 1 /** * 读excel 到list * * @param file excel file * @param fields 字段数组 * @return * ...
- commons-logging日志系统
日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息 是寸步难行的.所以在系统加入日志是必须的. 最原始的日志方式,就是在程序的适当地方添加System.out.prin ...