A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.util.concurrent.locks.*;
  2. class Account
  3. {
  4.         private String name;
  5.        
  6.         private int count;
  7.         private final Lock lock = new ReentrantLock();
  8.         private Condition condition_drawer = lock.newCondition();//将取钱的动作绑定到锁上
  9.         private Condition condition_deposite = lock.newCondition();//将存钱的动作绑定到锁上

  10.         private boolean flag = false;

  11.         Account(String name){
  12.                 this.name = name;       
  13.         }
  14.         public String getName(){
  15.                 return name;
  16.         }

  17.         public void draw()throws InterruptedException{
  18.                         lock.lock();
  19.                        
  20.                         try{
  21.                                 if(!flag)//在此处判断旗标为真时等待,保证账户有钱才能取
  22.                                         condition_drawer.await();
  23.                                 else{
  24.                                         System.out.println(Thread.currentThread().getName()+"---取钱-->>"+count);
  25.                                         try{Thread.sleep(100);}catch(InterruptedException e){}
  26.                                         flag = false;
  27.                                         condition_deposite.signalAll();
  28.                                 }
  29.                         }finally{
  30.                                 lock.unlock();//释放锁定义在finally块里,锁一定被释放,以免线程阻塞
  31.                         }

  32.         }
  33.         public void deposite()throws InterruptedException{
  34.                 lock.lock();
  35.                 try{
  36.                         if(flag)
  37.                                 condition_deposite.await();//方法await()会抛出InterruptedException异常
  38.                         else{
  39.                                 //因为账户必须先有钱才能取钱,因此count在此处自增,并且使用前自增,先增后用,保证存取数目一致
  40.                                 System.out.println(Thread.currentThread().getName()+"-----------存钱----->>"+(++count));
  41.                                 try{Thread.sleep(100);}catch(InterruptedException e){}
  42.                                 flag = true;
  43.                                 condition_drawer.signalAll();
  44.                         }
  45.                 }finally{
  46.                         lock.unlock();//释放锁定义在finally块里,锁一定被释放,以免线程阻塞
  47.                 }
  48.         }
  49. }
  50. class Draw extends Thread
  51. {
  52.         private Account account;
  53.        
  54.         Draw(String name,Account account){
  55.                 super(name);
  56.                 this.account = account;
  57.                
  58.         }
  59.         public void run()//覆盖Thread类的run方法,不能抛出异常
  60.         {
  61.                 while(true){
  62.                         try
  63.                         {
  64.                                 account.draw();
  65.                         }
  66.                         catch (InterruptedException e)
  67.                         {
  68.                         }
  69.                 }
  70.                
  71.         }
  72.        
  73. }
  74. class Deposite extends Thread
  75. {
  76.         private Account account;
  77.        
  78.         Deposite(String name,Account account){
  79.                 super(name);
  80.                 this.account = account;
  81.                
  82.         }
  83.         public void run()//覆盖Thread类的run方法,不能抛出异常
  84.         {
  85.                 while (true)
  86.                 {
  87.                         try
  88.                         {
  89.                                 account.deposite();
  90.                         }
  91.                         catch (InterruptedException e)
  92.                         {
  93.                         }       
  94.                 }
  95.         }
  96. }
  97. class  DrawThread01
  98. {
  99.         public static void main(String[] args)
  100.         {
  101.                 Account account = new Account("中国银行");

  102.                 Draw dr1 = new Draw("顾客张三******",account);
  103.                 Draw dr2 = new Draw("顾客梅梅******",account);

  104.                 Deposite de1 = new Deposite("*****顾客李四",account);
  105.                 Deposite de2 = new Deposite("*****顾客陈留",account);
  106.                
  107.                 dr1.start();
  108.                 dr2.start();
  109.                
  110.                 de1.start();
  111.                 de2.start();
  112.         }
  113. }
复制代码

点评

开玩笑,差远了。如果你能用张老师讲的并发库里的每一种工具把生产者消费者问题实现一遍,你的多线程算入门了  发表于 2014-8-17 19:38

6 个回复

倒序浏览
这个代码不难好不         ,关键是思路问题
回复 使用道具 举报
为什么用继承Thread。实现runable不好吗,
回复 使用道具 举报
落幕繁华 发表于 2014-8-17 18:29
为什么用继承Thread。实现runable不好吗,

实现Runnable接口,我不知道在打印语句中怎么打印出自定义的线程名字
回复 使用道具 举报
这标题。。。。
回复 使用道具 举报
初学者看到100行以上的代码都觉得好牛B
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马