写了一个程序结果出现了意料之外的结果。用手机发的 格式很乱大家不要介意 抱歉的
[code=Java] package org.cc.demo.Thread;class Tes implements Runnable{private boolean flag=true;private int i;public void run(){while(flag){{System.out.println(Thread.currentThread().getName()+"运行了:"+(i++)+"次");try{Thread.sleep(2000);}catch(Exception e){e.printStackTrace();}}}}   public void stop(){   this.flag=false;       System.out.println(Thread.currentThread().getName()+"线程停止");   }}public class Test {/** * @param args */public static void main(String[] args) {     Tes t=new Tes();     new Thread(t,"线程1").start();     try{     Thread.sleep(5000);     }catch(Exception e){     e.printStackTrace();     }     new Thread(t,"线程2").start();     new Thread(t,"线程3").start();     new Thread(new Tes(),"线程X").start();         t.stop(); }}/*线程1运行了:0次线程1运行了:1次线程1运行了:2次线程2运行了:3次main线程停止线程X运行了:0次线程X运行了:1次线程X运行了:2次线程X运行了:3次线程X运行了:4次线程X运行了:5次线程X运行了:6次线程X运行了:7次线程X运行了:8次线程X运行了:9次线程X运行了:10次线程X运行了:11次*/ /[code]
 这个是我无聊用来做测试的 为什么 输出的会是main停止 而不是其他的?

解决方案 »

  1.   

    我看到stop了,这些都废弃的接口还调用。。废弃表示该接口有着某些问题在那面
    ps:这代码谁看得进去谁是神
      

  2.   

    拜托 您没看到我类中定义的stop()方法吗? 没办法啊 我用手机的 你以为用电脑的话代码会这么乱吗?
      

  3.   

    package org.cc.demo.Thread;
    class Tes implements Runnable{
    private boolean flag=true;
    private int i;
    public void run(){
    while(flag){
    {System.out.println(Thread.currentThread().getName()+"运行了:"+(i++)+"次");
    try{Thread.sleep(2000);}
    catch(Exception e){e.printStackTrace();}}}}
       public void stop(){   this.flag=false;       System.out.println(Thread.currentThread().getName()+"线程停止");   }}public class Test 
    {/** * @param args */public static void main(String[] args) { 
        Tes t=new Tes(); 
        new Thread(t,"线程1").start();    
     try{     Thread.sleep(5000);   
      }catch(Exception e){   
      e.printStackTrace();     }   
      new Thread(t,"线程2").start();   
      new Thread(t,"线程3").start();   
      new Thread(new Tes(),"线程X").start();     
        t.stop(); }}
    /*线程1运行了:0次线程1运行了:1次线程1运行了:2次线程2运行了:3次main线程停止线程X运行了:0次线程X运行了:1次线程X运行了:2次线程X运行了:3次线程X运行了:4次线程X运行了:5次线程X运行了:6次线程X运行了:7次线程X运行了:8次线程X运行了:9次线程X运行了:10次线程X运行了:11次*/
    为什么显示的是main线程终止?
    大哥们 我是用手机打成txt 然后复杂过来发现回车都没了 计算机学院大一不准拿电脑 你叫我学java的来问个问题多累呢。我尽量打回车带来不便抱歉了
      

  4.   

    因为你的main线程里只是负责创建了其他几个线程呀,后面没有需要继续执行的了,而且你也没有调用过join方法,所以main线程是不会等到其他线程都结束了才结束的啦,它的使命完成就可以结束了。记住main线程也不是什么特殊的线程,它也跟其他线程差不多啦,不是说main线程结束了其他线程就一定都会结束的~
      

  5.   

    t.stop();  代码是在main方法中运行的,运行stop方法时当然在main的进程中
    ...
    public void run(){
        while(flag){
            {
                System.out.println(Thread.currentThread().getName()+"运行了:"+(i++)+"次");
                try{
                    Thread.sleep(2000);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
        stop();  //当前进程结束
    }
    ...
      

  6.   

    没明白 你的意思 `!! 线程调度 本来就是无规律可寻的 ` 你的main 创建完了 所有线程 (任务已经完成) 当然 就 stop了`! 你想要什么结果`?? main结束 其他线程也结束的话 可以 把 线程设置成 后台程序 
    或者 或者````
    还是你的 问题 是为啥 x 线程 一直运行吧`???
    你可以看看 Tes t --> 是在 main线程 中创建的  main 结束 释放所有资源 t 的引用就消失了!  而 x 是不是在 main 中的 new的 所以么  仅仅剩下 x 线程了```\(^o^)/~   希望对你有用
      

  7.   

    因为stop方法是main线程调用的
    new Thread(t,"线程2").start();   
    new Thread(t,"线程3").start();   
    new Thread(new Tes(),"线程X").start();   
    t.stop(); //这是在main方法里调用的,也就是main线程调用的,所以显示的main线程的名字
    你如果把stop方法放到线程的run里去调用,那就会显示该线程的名字了
    Thread.currentThread()表示当前线程,哪个线程调用此方法,就获得哪个线程对象
      

  8.   

    因为是在主线程中调用的stop方法,stop方法中的Thread.currentThread当然就是指的main主线程了。所以显示main线程停止
      

  9.   


    lass Test implements Runnable{
    //写了一个程序结果出现了意料之外的结果。用手机发的 格式很乱大家不要介意 抱歉的
    private boolean flag=true;
    private int i;
    public void run(){
    while(flag){
    {
    System.out.println(Thread.currentThread().getName()+"运行了:"+(i++)+"次");
    stop();//把stop()方法在这里调用看看 try{
    Thread.sleep(2000);
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }

    public void stop(){
    this.flag=false; 
    System.out.println(Thread.currentThread().getName()+"线程停止");
    }
    }
    public class Tst {
    /** * @param args */
    public static void main(String[] args) {
    Test t=new Test(); 
    new Thread(t,"线程1").start();
    try{ 
    Thread.sleep(5000); 
    }catch(Exception e){
    e.printStackTrace(); 

    new Thread(t,"线程2").start();
    new Thread(t,"线程3").start(); 
    new Thread(new Test(),"线程X").start();
    t.stop(); 
    }
    //线程1运行了:0次线程1运行了:1次线程1运行了:2次线程2运行了:3次main线程停止线程X运行了:0次线程X运行了:1次线程X运行了:2次线程X运行了:3次线程X运行了:4次线程X运行了:5次线程X运行了:6次线程X运行了:7次线程X运行了:8次线程X运行了:9次线程X运行了:10次线程X运行了:11次*/ /[code]
    // 这个是我无聊用来做测试的 为什么 输出的会是main停止 而不是其他的?
    }
    因为你的stop方法确实是在main函数里面调用的,不管你停止哪个线程结果都一样,但是你如果在运行线程里面打印效果就不同了哦,看看上面红色部分。
      

  10.   

    多谢回复了 明白了。。看来只有写在run里才可以呢 明天上机试试 多谢各位回复 分给的不多 抱歉的