首页 > 编程语言 >java 协调同步的线程

java 协调同步的线程

时间:2023-02-23 13:44:36浏览次数:34  
标签:同步 java Thread currentThread int getName 线程 void public

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.setName("李逵");
      zhangfei.start();
      likui.start();
   }
}
复制代码

TicketHouse.java

复制代码
public class TicketHouse implements Runnable {
   int fiveAmount=2,tenAmount=0,twentyAmount=0; 
   public void run() {
      if(Thread.currentThread().getName().equals("张飞")) {
          saleTicket(20);
      }
      else if(Thread.currentThread().getName().equals("李逵")) {
          saleTicket(5);
      }
   }
   private synchronized void saleTicket(int money) {
       if(money==5) {  //如果使用该方法的线程传递的参数是5,就不用等待
        fiveAmount=fiveAmount+1; 
        System.out.println( "给"+Thread.currentThread().getName()+"入场卷,"+
                            Thread.currentThread().getName()+"的钱正好");
       }
       else if(money==20) {           
         while(fiveAmount<3) {
            try { System.out.println("\n"+Thread.currentThread().getName()+"靠边等...");
                  wait();       //如果使用该方法的线程传递的参数是20须等待
                  System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
            }
            catch(InterruptedException e){}
         }
         fiveAmount=fiveAmount-3;
         twentyAmount=twentyAmount+1;
         System.out.println("给"+Thread.currentThread().getName()+"入场卷,"+
                            Thread.currentThread().getName()+"给20,找赎15元");
       }
       notifyAll();
   } 
}
复制代码

Bank.java

复制代码
public class Bank implements Runnable {
   int money=200;
   public void setMoney(int n) {
      money=n;
   }
   public void run() {
      if(Thread.currentThread().getName().equals("会计")) 
         saveOrTake(300);
      else if(Thread.currentThread().getName().equals("出纳"))
         saveOrTake(150);;
   }
    public synchronized void saveOrTake(int amount) { //存取方法
      if(Thread.currentThread().getName().equals("会计")) {
         for(int i=1;i<=3;i++) { 
             money=money+amount/3;      //每存入amount/3,稍歇一下
             System.out.println(Thread.currentThread().getName()+
                               "存入"+amount/3+",帐上有"+money+"万,休息一会再存");
             try { Thread.sleep(1000);  //这时出纳仍不能使用saveOrTake方法 
             }                       
             catch(InterruptedException e){}
         }
      }
      else if(Thread.currentThread().getName().equals("出纳")) {
         for(int i=1;i<=3;i++) { //出纳使用存取方法取出60
             money=money-amount/3;   //每取出amount/3,稍歇一下
             System.out.println(Thread.currentThread().getName()+
                               "取出"+amount/3+"帐上有"+money+"万,休息一会再取");
             try { Thread.sleep(1000);       //这时会计仍不能使用saveOrTake方法
             }                         
             catch(InterruptedException e){}
         }
      }
   }
}
复制代码

标签:同步,java,Thread,currentThread,int,getName,线程,void,public
From: https://www.cnblogs.com/kn-zheng/p/17147647.html

相关文章

  • 【JavaScript】25_数组初步
    1、简介数组(Array)数组也是一种复合数据类型,在数组可以存储多个不同类型的数据数组中存储的是有序的数据,数组中的每个数据都有一个唯一的索引可以通过索引来操作获取数据数......
  • 多线程
    介绍获得线程号#include<pthread.h>pthread_tpthread_self(void);功能:得到线程id参数:无返回值:调用此函数的线程id创建线程#include<pthread.h>intpthrea......
  • Docker Desktop配合WSL和IDEA进行Java服务的打包+镜像构建+容器运行测试
    在Windows1022H2+的版本可以使用WSL(WindowsSubsystemforLinux或叫 WindowsSupportLinux)了,即Windows内置的Linux子系统!它对于在Windows下工作的容器化微服务开......
  • java 网络编程Socket编程
        Server.javaimportjava.io.*;importjava.net.*;publicclassServer{publicstaticvoidmain(Stringargs[]){String[]answer={......
  • Java培训班多少钱,有没有便宜的
    Java软件开发行业至今的发展趋势是非常不错的,许多专业的Java培训班培养出来的学员都取得了不错的成绩,所以,这也是为什么每年都有同学不断报名培训的原因之一,为此,Java培训也......
  • java单体项目Hutools连接Sqlite
    hutools的官方示例只有连接MySql的用法,没有sqlite用法,但是项目又需要,就自己摸索了一下。参考springboot连接mysql方式做了一个,过程还是比较简单,这里做个记录 1,resourc......
  • java socket网络编程(多线程技术)
    Client.javaimportjava.io.*;importjava.net.*;importjava.util.*;publicclassClient{publicstaticvoidmain(Stringargs[]){Scannerscann......
  • 熟悉JavaScript闭包
    熟悉JavaScript闭包闭包(closure)是一个函数以及其捆绑的周边环境状态(lexicalenvironment,词法环境)的引用的组合。简而言之,闭包让开发者可以从内部函数访问外部函数的作用......
  • JavaScript 中的 apply、call、bind
    在JavaScript中,apply、call、bind是三个与函数调用相关的方法,它们都允许你在调用函数时手动设置函数的上下文(即this指向)。1、apply方法:apply方法允许你调用一个函......
  • java之线程池
    1.线程池的作用  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时......