黑马程序员技术交流社区

标题: 如果你能自己写出毕老师的多线程代码,你的多线程学的也差不多了 [打印本页]

作者: 嘿~~    时间: 2014-8-17 17:42
标题: 如果你能自己写出毕老师的多线程代码,你的多线程学的也差不多了
  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. }
复制代码

作者: 3040789425    时间: 2014-8-17 18:21
这个代码不难好不         ,关键是思路问题
作者: 落幕繁华    时间: 2014-8-17 18:29
为什么用继承Thread。实现runable不好吗,
作者: 嘿~~    时间: 2014-8-17 21:47
落幕繁华 发表于 2014-8-17 18:29
为什么用继承Thread。实现runable不好吗,

实现Runnable接口,我不知道在打印语句中怎么打印出自定义的线程名字
作者: 单线程xia    时间: 2014-8-17 21:54
这标题。。。。
作者: wawsc5354524    时间: 2014-8-18 00:21
初学者看到100行以上的代码都觉得好牛B




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2