A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王德南 中级黑马   /  2012-4-17 19:15  /  1936 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王德南 于 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, 下载次数: 16)

QQ截图未命名.jpg

3 个回复

倒序浏览
线程我觉得很难。我根据输出结果,说说自己的推测。
首先,你的代码如果将
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 20:41
线程我觉得很难。我根据输出结果,说说自己的推测。
首先,你的代码如果将
try {

不好意思代码复上去时没看清楚复错了。现在改过来了,也把我想要的结果写了出来。请指教啊,先说谢谢:lol
回复 使用道具 举报
ob1.t.join();
ob2.t.join();
ob3.t.join();
i当主线程遇到ob1.t.join后,会停下来,等ob1.t线程先执行,等它执行完,再执行下面的语句。同理ob2.t ob3.t也是一样的道理。这样写的话,相当于是一个线程在运行,等出的结果一直都是一样的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马