当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合本线程的需要,

那么可以在同步方法中使用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学习之协调同步的线程的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. java 学习 进阶之 一 (线程基础)

    一.线程安全 线程安全的概念:当多个线程访问某一个类(对象或方法)时.这个类始终都能表现出正确的行为那么这个类(对象或方法)就是线程安全的. synchronized:可以在任何对象及方法上加锁,而加 ...

  3. java 协调同步的线程

    Example12_8.java public class Example12_8 { public static void main(String args[ ]) { TicketHouse of ...

  4. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  5. 《java学习三》并发编程 -------线程池原理剖析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...

  6. Java 学习笔记之 Stop停止线程

    Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...

  7. Java 学习笔记之 Return停止线程

    Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...

  8. Java 学习笔记之 Sleep停止线程

    Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...

  9. 20165223《Java程序设计》第八周Java学习总结

    教材学习内容总结 第12章-JAVA多线程机制 要点 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 教材学习中的问题和解决过 ...

随机推荐

  1. UVA 1292 十二 Strategic game

    Strategic game Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Sta ...

  2. 关于directX最近的学习方案

    目标:弄清楚如何渲染一个地形,以及人物坐标以及摄像机方向,弄清四大矩阵原理 实践: 1.再次学习矩阵相关知识 2.实现红龙本书的地形 3.搜寻这方面资料书籍

  3. MATLAB模拟布丰投针实验

    MATLAB模拟布丰投针实验 标签(空格分隔): 算法 Buffon's Needle 桌面上有距离为a的若干平行线,将长度为L的针随机丢在桌面上,则这根针与平行线相交的概率是多少?假定L < ...

  4. hnoi 2016 省选总结

    感觉省选好难的说...反正我数据结构太垃圾正解想到了也打不出来打一打暴力就滚粗了! DAY1 0+20+30 DAY2 60-20+0+60 最后170-20分,暴力分还是没有拿全! 然而这次是给了5 ...

  5. web服务器安装配置

    学习目标 javaweb概念和web资源分类 服务器的分类和常用服务器apache说明 tomcat 服务器目录结构介绍和工程发布 虚拟主机说明和配置 1.Web的概念 1.1.JavaWeb的概念 ...

  6. 在Yii用createUrl中明明白白生成网址

    在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,actionX代表方法X.在Controller ...

  7. 利用tomcat配置网站

    1: 首先将tomcat考到C盘: 2:建立我们存放web应用的目录,我建立在D:\myWeb  ,然后将自己的web应用考到myWeb目录下: 3:wApp的目录结构为: WEB-INF: 结构: ...

  8. JS 和 Java 中URL特殊字符编码方式

    前几天遇到url特殊字符编码的问题,在这里整理一下: JavaScript 1.  编码 escape(String) 其中某些字符被替换成了十六进制的转义序列. 解码 unescape(String ...

  9. Android_使用 OpenVPN

    1. 需要 root http://www.doc88.com/p-847633362717.html http://bbs.gfan.com/android-3679297-1-1.html 需要 ...

  10. C# 上传RAR文件 解压 获取解压后的文件名称

    此方法适用于C盘windows文件夹中有WinRAR.exe文件 if (fileExt.ToUpper() == ".RAR") { string zpath = Server. ...