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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
本帖最后由 肚小糖 于 2015-9-17 16:29 编辑
  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class Demo28 {

  5.         public static void main(String[] args) {
  6.                 Ticket t = new Ticket(100);
  7.                 for(int i=0; i<5; i++){
  8.                         new Thread(t).start();
  9.                         try{
  10.                                 Thread.sleep(200);
  11.                         }catch(InterruptedException e){
  12.                                 e.printStackTrace();
  13.                         }
  14.                 }
  15.         }
  16. }
  17. class Ticket implements Runnable{
  18.         private int num;
  19.         private String id;
  20.         boolean flag = true;
  21.         Lock lock = new ReentrantLock();
  22.         Condition con = lock.newCondition();
  23.         public Ticket(int num){
  24.                 this.num = num;
  25.         }
  26.         public int getNum(){
  27.                 return num;
  28.         }
  29.         public void run(){
  30.                 lock.lock();
  31.                 if(flag){
  32.                         while(true){
  33.                                 synchronized(this){
  34.                                         if(num > 0){
  35.                                                 try{
  36.                                                         Thread.sleep(200);
  37.                                                         System.out.println(Thread.currentThread().getName()+"----"+num--);
  38.                                                 }catch(InterruptedException e){
  39.                                                         e.printStackTrace();
  40.                                                 }
  41.                                                 lock.unlock();
  42.                                                 this.notifyAll();
  43.                                                 break;
  44.                                         }
  45.                                         else{
  46.                                                 lock.unlock();
  47.                                                 break;
  48.                                         }
  49.                                 }
  50.                         }
  51.                 }
  52.         }
  53. }
复制代码
求大神帮我看看这个售票问题的程序错在哪里,程序执行打印出 Thread-0----100 之后就停在了那里。。。

最佳答案

查看完整内容

把第12行代码 t.flag = false; 注释掉就行了 ,我记得我回答过这个问题啊

4 个回复

正序浏览
夸克 发表于 2015-9-15 16:59
你这写的什么鬼啊,wait 和notify是等待唤醒机制,属于线程通信问题。
首先这题,都是处理卖票的 ...
  1. public class Demo28 {

  2.         public static void main(String[] args) {
  3.                 Ticket t = new Ticket(100);
  4.                 for(int i=0; i<5; i++){
  5.                         new Thread(t).start();
  6.                         try{
  7.                                 Thread.sleep(200);
  8.                         }catch(InterruptedException e){
  9.                                 e.printStackTrace();
  10.                         }
  11.                         t.flag = false;
  12.                 }
  13.         }
  14. }
  15. class Ticket implements Runnable{
  16.         private int num;
  17.         boolean flag = true;
  18.         public Ticket(int num){
  19.                 this.num = num;
  20.         }
  21.         public int getNum(){
  22.                 return num;
  23.         }
  24.         public void run(){
  25.                 if(flag){
  26.                         while(true){
  27.                                 synchronized(this){
  28.                                         if(num > 0){
  29.                                                 try{
  30.                                                         Thread.sleep(200);
  31.                                                 }catch(InterruptedException e){
  32.                                                         e.printStackTrace();
  33.                                                 }
  34.                                                 System.out.println(Thread.currentThread().getName()+"----"+num--);
  35.                                         }
  36.                                         else{
  37.                                                 break;
  38.                                         }
  39.                                 }
  40.                         }
  41.                 }
  42.         }
  43. }
复制代码


这样改了以后只有Thread-0在执行,这种情况怎么办?
回复 使用道具 举报
你这写的什么鬼啊,wait 和notify是等待唤醒机制,属于线程通信问题。
首先这题,都是处理卖票的问题,这五个线程的操作是一样的都是为了减少资源,用不到线程通信;生产者消费者问题这样的线程处理资源方式不相同(一个是增加,一个是减少)这样才需要线程间通信,用到等待唤醒机制。
而且你还用了1.5新特性lock锁,那么你定义了condition为啥没用con.await和con.signal ,还有wait和sleep用法是不一样的,特别是涉及到锁的时候。
回复 使用道具 举报
一分一分的攒,天啊
回复 使用道具 举报
肚小糖 发表于 2015-9-16 08:42
这样改了以后只有Thread-0在执行,这种情况怎么办?

把第12行代码   t.flag = false;  注释掉就行了 ,我记得我回答过这个问题啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马