java学习之协调同步的线程

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

那么可以在同步方法中使用wait(),wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。

其他线程如果在使用这个同步方法时,不许需要等待,那么它使用这个同步方法。其他线程如果再使用这个同步方法是不需要等待,那么它使用完

这个同步方法的同时,应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待.曾中断的线程就会从刚才的中断处继续执行

这个同步方法.....

1 /*
2       wait();
3       notify();
4       notifyAll();
5 */

在下面的列子中:

/*
    张飞和李逵买电影票。售票员只有两张5元的钱,电影票5元一张。张飞
   拿20元一张的人民币排在李逵的前面买票,李逵拿一张5元的人民币买票,因此张飞必须等待。
*/
 1 //package Scan_boobs;
 2 public class Example12_8 extends window_scan
 3 {
 4     public static void main(String args [] )
 5     {
 6       TicketHouse officer = new TicketHouse();
 7       Thread zhangfei ,likui;
 8       zhangfei = new Thread(officer);
 9       zhangfei.setName("张飞");
10       likui = new Thread(officer);
11       likui.setName("李逵");
12       zhangfei.start();
13       likui.start();
14     }
15 }
16
17 class TicketHouse implements Runnable
18 {
19     int fiveAmount=2,tenAmount=0,twentyAmount=0;
20     @Override
21     public void run() {
22         // TODO Auto-generated method stub
23        String name=Thread.currentThread().getName();
24         if(name.equals("张飞")) saleTicket(20);
25         else  saleTicket(5);
26
27     }
28   private synchronized void saleTicket(int money)
29   {
30     if(money==5)
31     {
32       fiveAmount++;
33       this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
34               +Thread.currentThread().getName()+"的钱正好");
35     }
36     else if(money==20)
37     {
38         while(fiveAmount<3)
39         {
40             try {
41                  this.out("\n"+Thread.currentThread().getName()+"靠边等....");
42                  wait();
43               // Thread.sleep(3000);
44                   this.out("\n"+Thread.currentThread().getName()+"继续买票");
45             } catch (InterruptedException e) {
46                 // TODO Auto-generated catch block
47                 e.printStackTrace();
48             }
49         }
50         fiveAmount-=3;
51         twentyAmount++;
52         this.out("给"+Thread.currentThread().getName()+"入场卷,"
53                 +Thread.currentThread().getName()+"给20,找赎15元");
54     }
55     notifyAll();
56   }
57  private void out(String name)
58  {
59   System.out.println(name);
60  }
61 }

需要特别注意:

/*
     在许多实际的问题中wait方法应当放在一个"while(等待的条件){}"的循环语句中,而不是“if(等待条件){}的分支语句中”
*/

如果咸的蛋疼了,将wait();  ----》改为 Thread.sleep(); 然后呵呵,你会就会这样   

代码:

 1 package Scan_boobs;
 2 public class Example12_8 extends window_scan
 3 {
 4     public static void main(String args [] )
 5     {
 6       TicketHouse officer = new TicketHouse();
 7       Thread zhangfei ,likui;
 8       zhangfei = new Thread(officer);
 9       zhangfei.setName("张飞");
10       likui = new Thread(officer);
11       likui.setName("李逵");
12       zhangfei.start();
13       likui.start();
14     }
15 }
16
17 class TicketHouse implements Runnable
18 {
19     int fiveAmount=2,tenAmount=0,twentyAmount=0;
20     @Override
21     public void run() {
22         // TODO Auto-generated method stub
23        String name=Thread.currentThread().getName();
24         if(name.equals("张飞")) saleTicket(20);
25         else  saleTicket(5);
26
27     }
28   private synchronized void saleTicket(int money)
29   {
30     if(money==5)
31     {
32       fiveAmount++;
33       this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
34               +Thread.currentThread().getName()+"的钱正好");
35     }
36     else if(money==20)
37     {
38         while(fiveAmount<3)
39         {
40             try {
41                  this.out("\n"+Thread.currentThread().getName()+"靠边等....");
42                  wait();
43               // Thread.sleep(3000);
44                   this.out("\n"+Thread.currentThread().getName()+"继续买票");
45             } catch (InterruptedException e) {
46                 // TODO Auto-generated catch block
47                 e.printStackTrace();
48             }
49         }
50         fiveAmount-=3;
51         twentyAmount++;
52         this.out("给"+Thread.currentThread().getName()+"入场卷,"
53                 +Thread.currentThread().getName()+"给20,找赎15元");
54     }
55     notifyAll();
56   }
57  private void out(String name)
58  {
59   System.out.println(name);
60  }
61 }

效果图:

java学习之协调同步的线程

时间: 2024-11-11 01:55:21

java学习之协调同步的线程的相关文章

疯狂Java学习笔记(62)------------线程初识

线程初识 没有线程编程的程序好比一个人一只手干活,而多线程的程序就好比一个人多只手干活. 进程是系统资源分配的独立单位,而线程是可调度运行的独立单位,一个进程可以拥有多个线程,线程是进程并行完成的多个任务. 进程.线程.并发执行 首先我们先来认识一下进程.线程.并发执行的概念: 一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程.启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的. 在进程中,有些程序流程块是可以乱序执行的,并

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.setN

疯狂Java学习笔记(64)------------线程转换

线程的生命周期 由上图可以看出: 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞. 各个状态细节不再赘述,具体请看http://blog.csdn.net/u011225629/article/details/46288995此篇博文 此篇博文主要讲述各个状态的实例! 一.新建和就绪状态 此处不做细致的讲解,在上一篇博文中已经讲解过了! package com.haixu.thread2; public class InvokeRun exte

Java学习笔记---多线程同步的五种方法

一.引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊.闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块.假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚.因此多线程同步就

疯狂Java学习笔记(63)-----------线程进阶

Java线程各个阶段的状态: 那么我们开始一点点研究吧: 启动线程 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法:否则,该方法不执行任何操作并返回.   Thread 的子类应该重写该方法. 2.实现java.lang.Runnable接口. void run() 使用实现接口 Runnable

疯狂Java学习笔记(65)---------线程协作

线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,

Java学习之多线程同步 &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 要求:用两个线程分别输出0到100之间的奇数和偶数,要求先输出10个奇数,再输出10个偶数,再输出10个奇数,以此类推 //Print类 public class Print { public void odd(int i){ System.out.printl

JAVA学习笔记(三十九)- 线程优先级

线程优先级 /* * 线程优先级,范围[1,10] * 不同优先级的线程获取执行的机会不同,优先级越高,执行机会越大 * * 对比不同优先级的线程被执行的机率 */ public class Test05 { public static void main(String[] args) { System.out.println("最大优先级:" + Thread.MAX_PRIORITY); System.out.println("最小优先级:" + Thread.

JAVA学习笔记(四十)- 守护线程与中断线程

守护线程 /* * Daemon线程,即守护线程 * 一般都在后台运行,为其他线程提供服务,不能单独存在 */ public class Test08 { public static void main(String[] args) { MyThread8 t1 = new MyThread8("守护线程"); System.out.println("是守护线程吗?"+t1.isDaemon()); t1.setDaemon(true); System.out.pr