黑马程序员技术交流社区

标题: 关于线程的问题 [打印本页]

作者: 王德南    时间: 2012-4-17 19:15
标题: 关于线程的问题
本帖最后由 王德南 于 2012-4-17 21:40 编辑

下面这段代码call()方法通过调用sleep()允许执行转换到另一个线程。为什么结果是3个字符串的混合输出的啊????
package com;

public class Demo6 {

        
        public static void main(String[] args) {
                Callme target=new Callme();
                Caller ob1=new Caller(target, "Hello");
                Caller ob2=new Caller(target, "Beauty");
                Caller ob3=new Caller(target, "World");
       try {
                ob1.t.join();
                ob2.t.join();
                ob3.t.join();
        } catch (InterruptedException e) {
              System.out.println("InterruptedException");
        }
        }

}
class Callme{
        void call(String message){
                System.out.print("["+message);
                try{
                        Thread.sleep(1000);
                }catch (InterruptedException e) {
                        System.out.println("Interrupted");
                }
                  System.out.println("]");

        }
}
class Caller implements Runnable {
        String message;
    Callme target;
    Thread t;
    public Caller(Callme targ,String s){
            target=targ;
            message=s;
            t=new Thread(this);
            t.start();
    }
        
        public void run() {
               
                target.call(message);
        }
}
为什么这样输出的啊???
为什么不是
[Hello]
[Beauty]
[World]
这种形式的啊

QQ截图未命名.jpg (7.34 KB, 下载次数: 14)

QQ截图未命名.jpg

作者: 李哲    时间: 2012-4-17 20:41
线程我觉得很难。我根据输出结果,说说自己的推测。
首先,你的代码如果将
try {
                ob1.t.join();
                ob2.t.join();
                ob3.t.join();
        } catch (InterruptedException e) {
              System.out.println("InterruptedException");
        }
注释掉,结果不会改变。第一个创建的Callme对象,显然不会打印任何东西,因为是Callme(),而不是Callme(String message).也就是说前面的3个构造函数产生的输出结果。
因为代码没有异常发生,所以,“]”不会被打印。
后面的3个join方法。我的理解是:这三个线程其实也就是前面的构造函数产生的线程,而不是新产生的线程。但是这些线程已经执行完毕,即使再加进来,也不会再打印什么东西。

我这些只是自己猜测运行的过程。

而且我总不知道你本来想得到什么运行结果呢?

作者: 王德南    时间: 2012-4-17 21:42
李哲 发表于 2012-4-17 20:41
线程我觉得很难。我根据输出结果,说说自己的推测。
首先,你的代码如果将
try {

不好意思代码复上去时没看清楚复错了。现在改过来了,也把我想要的结果写了出来。请指教啊,先说谢谢:lol
作者: 黑马—王宁    时间: 2012-4-17 22:58
ob1.t.join();
ob2.t.join();
ob3.t.join();
i当主线程遇到ob1.t.join后,会停下来,等ob1.t线程先执行,等它执行完,再执行下面的语句。同理ob2.t ob3.t也是一样的道理。这样写的话,相当于是一个线程在运行,等出的结果一直都是一样的。





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