日期:2014-05-20  浏览次数:20680 次

java多线程一个问题。
写了一个程序结果出现了意料之外的结果。。。。用手机发的 格式很乱大家不要介意 抱歉的
[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停止 而不是其他的?

------解决方案--------------------
因为你的main线程里只是负责创建了其他几个线程呀,后面没有需要继续执行的了,而且你也没有调用过join方法,所以main线程是不会等到其他线程都结束了才结束的啦,它的使命完成就可以结束了。记住main线程也不是什么特殊的线程,它也跟其他线程差不多啦,不是说main线程结束了其他线程就一定都会结束的~
------解决方案--------------------
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(); //当前进程结束
}
...
------解决方案--------------------
没明白 你的意思 `!! 线程调度 本来就是无规律可寻的 ` 你的main 创建完了 所有线程 (任务已经完成) 当然 就 stop了`! 你想要什么结果`?? main结束 其他线程也结束的话 可以 把 线程设置成 后台程序 


或者 或者````
还是你的 问题 是为啥 x 线程 一直运行吧`???
你可以看看 Tes t --> 是在 main线程 中创建的 main 结束 释放所有资源 t 的引用就消失了! 而 x 是不是在 main 中的 new的 所以么 仅仅剩下 x 线程了```\(^o^)/~ 希望对你有用
------解决方案--------------------
因为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()表示当前线程,哪个线程调用此方法,就获得哪个线程对象

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

lass Test implements Runnable{
    //写了一个程序结果出现了意料之外的结果。。。。用手机发的 格式很乱大家不要介意 抱歉的
    private boolean flag=true;
    private int i;
    public void run(){
        while(flag){
            {
                System.out.println(Thread.currentThread().getName()+"运行了:"+(i++)+"次");
                [color=#FF0000]stop();//把stop()方法在这里调用看看[/color]                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停止 而不是其他的?
}