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游戏开发】Application.systemLanguage无法区分简体中文和繁体中文 (二六)
游戏发布,语言本地化需要繁体中文和简体中文 iOS8版本之前没问题,iOS9上无法正常识别这两种语言 原因是在iOS9上,Unity通过Application.systemLanguage返回的简体中 ...
- Java_你应该知道的26种设计模式
四. 模板方法模式 Definition: Define the skeleton of an algorithm in an operation, deferring some steps to s ...
- 5.5.3使用terminfo功能标志
当使用terminfo时,需要做的第一件事就是调用函数setupterm来设置终端类型.这将为当前的终端类型初始化一个TERMINAL结构.然后,你就可以查看当前终端的功能标志并使用他们的功能了. # ...
- linux包的相关命令
apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...
- Codeforces Round #237 (Div. 2) A
链接:http://codeforces.com/contest/404/problem/A A. Valera and X time limit per test 1 second memory l ...
- js中两个对象的比较
代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...
- java使用方法总结
第一章 字符串 . 获取字符串的长度: length() . 判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s) .后缀 endsWith(String s) ...
- [转载] 彻底学习STL中的Allocator
原文: http://cissco.iteye.com/blog/379093 帮助我们理解allocator的原理 Allocator是C++语言标准库中最神秘的部分之一.它们很少被显式使用,标准也 ...
- mtk lcm驱动加载流程 (转载)
平台:mt6582 + Android 4.4 前面就说过,在mtk代码中支持屏是可兼容的,通过调用驱动中的compare_id函数来匹配驱动和屏,这里来细看一下代码. 1. LK部分(mediate ...
- poj1981Circle and Points(单位圆覆盖最多的点)
链接 O(n^3)的做法: 枚举任意两点为弦的圆,然后再枚举其它点是否在圆内. 用到了两个函数 atan2反正切函数,据说可以很好的避免一些特殊情况 #include <iostream> ...