黑马程序员技术交流社区

标题: 诸位大神 , 请教多线程小问题 , 该程序为何不能正常 . . ... [打印本页]

作者: .____盒子    时间: 2014-7-2 02:43
标题: 诸位大神 , 请教多线程小问题 , 该程序为何不能正常 . . ...
本帖最后由 .____盒子 于 2014-7-7 16:17 编辑

  请教多线程问题  , 该程序为何不能正常打印出三个窗口正确的线程  ? ? ?


public class TicketDemo {
    public static void main(String[] args) {

        // 创建自定义线程
        ticket m = new ticket();
        //
        Thread th1 = new Thread(m, "窗口1");
        Thread th2 = new Thread(m, "窗口2");
        Thread th3 = new Thread(m, "窗口3");
        // 调用start()方法
        th1.start();
        th2.start();
        th3.start();
    }
}



public class ticket implements Runnable {
   
   
    private int ticket =100;
    @Override
    public void run() {
        // 定义票数
        
   
        while(true){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(ticket>0){
               
                System.out.println(Thread.currentThread().getName()+"-  - "+ticket+"余票--");
            }
        }
        
    }

}

作者: 陈云阳    时间: 2014-7-2 04:23
骚年,视频再多看几遍就理解了,问问题都没问到点子上,那就按我的方式给你解答吧,
接代码
  1. class TicketDemo {
  2.     public static void main(String[] args) {

  3.         // 创建自定义线程
  4.         ticket m = new ticket();
  5.         //
  6.         Thread th1 = new Thread(m, "窗口1");
  7.         Thread th2 = new Thread(m, "窗口2");
  8.         Thread th3 = new Thread(m, "窗口3");
  9.         // 调用start()方法
  10.         th1.start();
  11.         th2.start();
  12.         th3.start();
  13.     }
  14. }



  15. class ticket implements Runnable
  16. {
  17.     private int ticket =100;
  18.         Object obj = new Object();
  19.     public  void run()
  20.         {
  21.         // 定义票数
  22.                         while(ticket>0)//设定条件,票卖完,让程序结束
  23.                         {
  24.                                 try{Thread.sleep(10);}catch (Exception e){} //尽量让3个线程均匀运行
  25.                                 synchronized(obj)//加锁避免出现 -1 0票安全问题
  26.                                 {
  27.                                         if(ticket>0)
  28.                                         {
  29.                                                 System.out.println(Thread.currentThread().getName()+"-  - "+ticket--+"票");
  30.                                         }
  31.                                 }
  32.                         }
  33.         }   
  34. }
复制代码

作者: EarlyHeart    时间: 2014-7-2 06:21
本帖最后由 EarlyHeart 于 2014-7-2 06:23 编辑

1. 程序最后一行System.out.println(Thread.currentThread().getName()+"-  - "+ticket+"余票");ticket后面忘加ticket--(自减符号)了。所以整句代码应为:System.out.println(Thread.currentThread().getName()+"-  - "+ticket--+"余票");
2.为什么类TicketDemo与ticket (类名首字母最好大写即Ticket)前均有public修饰?难道分别写在了两个文件中?如果不是,至少应去掉一个public
(一个源文件中最多只能有一个公有类(public class))。
3.楼主应该还没看到后面吧,现在的这个代码还有线程安全问题,后面会讲到。




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