public class TestWhile extends Thread{
// 
// int ticket = 50;
// public void run(){
// while(ticket<2){
// System.out.println(Thread.currentThread().getName()+"\t"+ticket--);
// }
// }public static void main(String args[]){
new whilet().start();
new whilet().start();
}
}class whilet extends Thread{
static int ticket = 50;
static{
System.out.println("dayin");
}
public void run(){while(true){
System.out.println(Thread.currentThread().getName()+"\t"+ticket--);
}
}}
请帮忙解析下面的输出结果
我使用的是jdk5 和eclipse3.2
输出结果为:
Thread-0 -127757
Thread-0 -127758
Thread-0 -127759
Thread-1 -127748
Thread-1 -127761
Thread-1 -127762
Thread-1 -127763
Thread-1 -127764
Thread-1 -127765
Thread-1 -127766
Thread-1 -127767
Thread-1 -127768
-------------

解决方案 »

  1.   

    /*线程没有同步!关于同步有2种方法,一种是同步方法,另一种是同步块。*/
    public class TestWhile extends Thread { 
    // 
    // int ticket = 50; 
    // public void run(){ 
    // while(ticket <2){ 
    // System.out.println(Thread.currentThread().getName()+"\t"+ticket--); 
    // } 
    // } public static void main(String args[]){ 
    System.out.println("main:"+Thread.currentThread().getName());
    new whilet().start(); 
    new whilet().start(); 

    } class whilet extends Thread{ 
    static int ticket = 50; 
    static Object obj=new Object();  //加锁目标
    //static{ 
    //System.out.println("dayin"); 
    //} 
    public void run(){  while(true){ 

    synchronized(obj){ //给obj对象加锁,同步块
    if(ticket>0){
    try{
    Thread.sleep(10);
                                                 //睡眠10毫秒,仅仅是为了测试结果
    }catch(Exception e){
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+"\t"+ticket--); 
             }
         } 

    }

      

  2.   

    先谢谢你的回答,
    但是:在没有加锁之前的输出中没有静态代码块的输出,同时ticket的初始值100好像也没有什么作用.
      

  3.   

    楼主我教你怎么贴代码:
    1、将代码进行良好的格式化,以方便阅读。
    2、在发帖文本框的上方单击“#”按钮,选择 Java
    3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:public class Hello {    // 程序入口
        public static void main(String[] args) {
            System.out.println("Hello!");
        }
    }
      

  4.   

    起作用了。。你最好断点看一下,只是你得值太小了。显示缓冲区早就给刷没了的结果LZ如果不加断点得话。最好学1楼得加入sleep函数,你就能看出来了。
      

  5.   

    /*线程没有同步!关于同步有2种方法,一种是同步方法,另一种是同步块。*/
    public class TestWhile extends Thread { 
    // 
    // int ticket = 50; 
    // public void run(){ 
    // while(ticket <2){ 
    // System.out.println(Thread.currentThread().getName()+"\t"+ticket--); 
    // } 
    // } public static void main(String args[]){ 
        System.out.println("main:"+Thread.currentThread().getName());
    new whilet().start(); 
    new whilet().start(); 

    } class whilet extends Thread{ 
    static int ticket = 50; 
    static Object obj=new Object();  //加锁目标
    static{ 
    System.out.println("dayin");   //去掉最static块注释

    public void run(){     while(true){ 
                
                synchronized(obj){ //给obj对象加锁,同步块
                    if(ticket>0){
                        try{
                            Thread.sleep(10);
                                                 //睡眠10毫秒,仅仅是为了测试结果
                        }catch(Exception e){
                            e.printStackTrace();
                        }
                    System.out.println(Thread.currentThread().getName()+"\t"+ticket--); 
                     }
                 } 
        } 
    }
    } //!LZ再去好好测试下咯(已在本人机子运行过)
      

  6.   


    楼主这段代码的问题如下:
    1、线程没有同步,按2楼兄弟这样就好。
    2、while是一个死循环,所以你没有看到静态代码块的输出结果和ticket的初始值,只看到了后面的一段代码。public class TestWhile extends Thread{
    //
    // int ticket = 50;
    // public void run(){
    // while(ticket <2){
    // System.out.println(Thread.currentThread().getName()+"\t"+ticket--);
    // }
    // }public static void main(String args[]){
      new whilet().start();
      new whilet().start();
    }
    }class whilet extends Thread{
      static int ticket = 50;
      static{
        System.out.println("dayin");
      }
      public void run(){    while(ticket > 0){
          System.out.println(Thread.currentThread().getName()+"\t"+ticket--);
        }
      }}