黑马程序员技术交流社区

标题: 多线程中运行不报错,但结果却出错 [打印本页]

作者: 潘天功    时间: 2012-11-29 20:54
标题: 多线程中运行不报错,但结果却出错
本帖最后由 潘天功 于 2012-11-29 21:51 编辑

public class TicketDemo4 implements Runnable {
private int tickets = 100;
Object obj = new Object();
@Override
public void run() {
  while (true) {
   synchronized (obj) {
    if (tickets > 0) {
     try {
      Thread.sleep(10);
                     } catch (InterruptedException e) {
                                   e.printStackTrace();
                                              }      
                     }
      System.out.println(Thread.currentThread().getName() + "卖出第:"+ (tickets--) + "张票");
                   }
           }
     }
}
public class TicketDemoTest4 {
       public static void main(String[] args){
        TicketDemo4 td = new TicketDemo4();
        
        Thread t1 = new Thread(td,"窗口1:");
        Thread t2 = new Thread(td,"窗口2:");
        Thread t3 = new Thread(td,"窗口3:");
        Thread t4 = new Thread(td,"窗口4:");
     
        t1.start();
        t2.start();
        t3.start();
        t4.start();
       }
}
编译通过、运行也通过、就是结果不对?请大家帮忙看看哪里不对

作者: madianguo    时间: 2012-11-29 21:13
java文件允许有多个class,但是只能有一个用public修饰。因为java的编译机制是从这个public开始的。如果,你加的这个里面方法不是public static void main(),编译机制就会出错了。而且,你加的这个public的class名必须是你java文件的文件名,否则也无法编译。

作者: 王震阳老师    时间: 2012-11-29 21:16
  1. class TicketDemo4 implements Runnable {
  2. private int tickets = 100;
  3. Object obj = new Object();
  4. public void run() {
  5.   while (true) {
  6.           try
  7.           {
  8.                 Thread.sleep(10);
  9.           }
  10.           catch (Exception e)
  11.           {
  12.                   System.out.println(e.toString());
  13.           }
  14.    synchronized (obj) {
  15.     if (tickets > 0) {
  16.           System.out.println(Thread.currentThread().getName() + "卖出第:"+ (tickets--) + "张票");
  17.                     
  18.                      }
  19.       
  20.                    }
  21.            }
  22.      }
  23. }
  24. class TicketDemoTest4 {
  25.        public static void main(String[] args) throws Exception{
  26.         TicketDemo4 td = new TicketDemo4();
  27.         
  28.         Thread t1 = new Thread(td,"窗口1:");
  29.         Thread t2 = new Thread(td,"窗口2:");
  30.         Thread t3 = new Thread(td,"窗口3:");
  31.         Thread t4 = new Thread(td,"窗口4:");
  32.      
  33.         t1.start();
  34.         t2.start();
  35.         t3.start();
  36.         t4.start();
  37.        }
  38. }
复制代码
你的要打印的代码放置的位置不对,应该放置在if{}体里面。我已经给你修改了,结果已经正确了。

多线程买票截图.jpg (58.08 KB, 下载次数: 28)

多线程买票截图.jpg

作者: 潘天功    时间: 2012-11-29 21:51
王震阳 发表于 2012-11-29 21:16
你的要打印的代码放置的位置不对,应该放置在if{}体里面。我已经给你修改了,结果已经正确了。
...

嗯、呵呵、谢谢




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