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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 .____盒子 于 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+"余票--");
            }
        }
        
    }

}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

2 个回复

倒序浏览
骚年,视频再多看几遍就理解了,问问题都没问到点子上,那就按我的方式给你解答吧,
接代码
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 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.楼主应该还没看到后面吧,现在的这个代码还有线程安全问题,后面会讲到。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马