专栏首页mljava学习之协调同步的线程

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 }

效果图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多线程处理N维度topk问题demo--[c++]

    Gxjun
  • hdu 1829 A Bug's Life(分组并查集(偏移量))

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/3276...

    Gxjun
  • poj----Maximum sum(poj 2479)

    Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3...

    Gxjun
  • Java 多线程之 Runnable VS Thread 及其资源共享问题

    对于 Java 多线程编程中的 implements Runnable 与 extends Thread,部分同学可能会比较疑惑,它们之间究竟有啥区别和联系呢?...

    用户1177713
  • Transformer各层网络结构详解!面试必备!(附代码实现)

    《Attention Is All You Need》是一篇Google提出的将Attention思想发挥到极致的论文(https://arxiv.org/pd...

    AI研习社
  • Transformer各层网络结构详解!

    本文为 AI 研习社社区用户 @mantch 的博客内容,欢迎扫描底部社区名片访问 @mantch的主页,查看更多内容。

    AI科技评论
  • Android内存优化 | LeakCanary/Profiler & 非静态内部类耗时操作 实战分析

    使用Profiler, 选择一段陡增的曲线, 选择恰当的排序方式: 也可以看到InnerClassActivity被各种点名:

    凌川江雪
  • HashMap就是这么简单【源码剖析】

    Java3y
  • SQL反模式学习笔记7 多态关联

    多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的。

    张传宁老师
  • rabbitmq系列(一)初识rabbitmq

    案例:假如我们开发了一个商品抢购网站。这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息...

    Java旅途

扫码关注云+社区

领取腾讯云代金券