class Callme {
void call (String msg) {
System.out.print("[" + msg);
try{
Thread.sleep(1000);
}catch(InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println("]");
}
}
class Caller implements Runnable {
String msg;
Callme target;
Thread t;

public Caller(Callme targ, String s){
target = targ;
msg = s;
t = new Thread(this);
t.start();
}

public void run() {
synchronized(target){
target.call(msg);
}
}
}

class Synch {
public static void main (String args[]) {
Callme target = new Callme();
Caller ob1 = new Caller(target, "Hello");
Caller ob2 = new Caller(target, "Synchronized");
Caller ob3 = new Caller(target, "World");

//wait for threads to end
try {
ob1.t.join();
ob2.t.join();
ob3.t.join();
}catch(InterruptedException e) {
System.out.println("Interrupted");
}
}
}为什么每次运行的结果都不一样?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【hanjingjava】截止到2008-06-28 10:22:24的历史汇总数据(不包括此帖):
    发帖数:9                  发帖分:140                
    结贴数:9                  结贴分:140                
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

    你这程序应该不会出现不同的情况吧~~
    毕竟你的线程start的时候是在构造器里.而且run方法里还有同步.能把多次运行的结果帖出来不`~
      

  3.   

    E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Hello]
    [World]
    [Synchronized]
    E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Hello]
    [Synchronized]
    [World]E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Hello]
    [World]
    [Synchronized]E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Hello]
    [World]
    [Synchronized]E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Hello]
    [World]
    [Synchronized]E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Synchronized]
    [Hello]
    [World]E:\Learning\Java\JavaTutorial\Core_Java\CoreJavaPro>java Synch
    [Synchronized]
    [World]
    [Hello]
      

  4.   

    D:\>java Synch
    [Hello]
    [World]
    [Synchronized]D:\>java Synch
    [Hello]
    [World]
    [Synchronized]D:\>java Synch
    [Hello]
    [World]
    [Synchronized]D:\>java Synch
    [Hello]
    [World]
    [Synchronized]D:\>java Synch
    [Hello]
    [World]
    [Synchronized]D:\>java Synch
    [Hello]
    [Synchronized]
    [World]D:\>java Synch
    [Hello]
    [World]
    [Synchronized]D:\>java Synch
    [Hello]
    [Synchronized]
    [World]
    这是我运行的结果.
    hello先执行而 world synchronize后执行的话可以说是抢占.
    但是你最后有一个还是synchronize最先执行...不太明白`
      

  5.   

    D:\eclipse\workspace\Test>java Synch
    [Hello]
    [Synchronized]
    [World]D:\eclipse\workspace\Test>java Synch
    [Hello]
    [Synchronized]
    [World]D:\eclipse\workspace\Test>java Synch
    [Hello]
    [Synchronized]
    [World]D:\eclipse\workspace\Test>java Synch
    [Hello]
    [Synchronized]
    [World]D:\eclipse\workspace\Test>java Synch
    [Hello]
    [Synchronized]
    [World]这是我运行出来的结果,没问题呀?