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

那么可以在同步方法中使用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. UVALive 6500 Boxes

    Boxes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Pract ...

  2. 《微信开发日志》之OAuth2验证接口

    OAuth2接口说明: 企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0验证接口来获取员工的身份信息. 通过此接口获取用户身份会有一定的时间开销.对于频繁获取用户身份 ...

  3. [转]SIP穿越NAT&FireWall解决方案

    原文链接(也是转载)http://blog.csdn.net/yetyongjin/article/details/6881491.我修改了部分错字.   SIP从私网到公网会遇到什么样的问题呢? 1 ...

  4. oracle默认管理员的帐号和密码以及密码修改和解除锁定

    安装 ORACLE 时,若没有为下列用户重设密码,则其默认密码如下: 用户名 / 密码 登录身份 说明 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMA ...

  5. 读写分离提高 SQL Server 并发性能

    以下内容均非原创,仅作学习.分享!! 在 一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡. ...

  6. Android 测试工具

    有时候会发现给手机烧入的信息里少了某一些文件,比如一个图标,或者一个mp3文件之类的等等,为此做了一个小工具检查指定手机里面是否包含相应的文件. 通过程序执行手机的命令来操作手机,感觉还挺有意思的. ...

  7. [ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5999  Solved: 2473[Submit][Stat ...

  8. JMS【三】--ActiveMQ简单的HelloWorld实例

    第一篇博文JMS[一]--JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文JMS[二 ...

  9. HDU 1754

    成段更新 easy #include <stdio.h> #include <string.h> #include <math.h> #include <io ...

  10. 关于我们DOM的知识点

    DOM的概念及子节点类型   前言 DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析 ...