zoukankan      html  css  js  c++  java
  • 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("
    "+Thread.currentThread().getName()+"靠边等....");
    42                  wait();
    43               // Thread.sleep(3000);
    44                   this.out("
    "+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("
    "+Thread.currentThread().getName()+"靠边等....");
    42                  wait();
    43               // Thread.sleep(3000);
    44                   this.out("
    "+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 }

    效果图:

  • 相关阅读:
    log4net的使用
    数据库概念及构成
    基于C#WPF框架——动画
    基于C# WPF框架的贪吃蛇
    使用Teigha.net读取CAD的常用功能模块
    Teigha.net实体属性注释
    .net(C#数据库访问) Mysql,Sql server,Sqlite,Access四种数据库的连接方式
    Delphi解析修改Json文件,基于superobject.pas(ISuperObject)
    C++结构体与Delphi结构体相互传参,结构体中包含结构体的嵌套,数组指针
    C++ Json解析CJsonObject的详细使用
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3895076.html
Copyright © 2011-2022 走看看