我试图使用关键字" synchronized"但结果不正确。我无法弄清楚为什么在第二个对象之前调用第三个对象。
预期产出:
hello
synchronized
world
输出 - 我得到的是
hello
world
synchronized
以下是我正在使用的代码:
class Callme{
synchronized void call(String msg){
System.out.print("["+msg);
try{
Thread.sleep(1000);
}catch(InterruptedException ie){}
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(){
target.call(msg);
}
}
class Synch{
public static void main(String[] args){
Callme target=new Callme();
Caller c1=new Caller(target,"hello");
Caller c2=new Caller(target,"Synchronized");
Caller c3=new Caller(target,"world");
try{
System.out.println("Waiting for the threads to end");
c1.t.join();
c2.t.join();
c3.t.join();
}catch(InterruptedException ie){}
}
}
答案 0 :(得分:5)
你正在开始三个主题。其中每个都会在call
上调用Callme
,因此一次只有一个线程将执行call
...但这并不意味着线程将在命令你开始它们。
想象一下,你开始一场跑步比赛,在赛道中途,你有一个门,一次只能有一个人通过。你几乎在同一时间开始10个跑步者 - 你为什么期望跑步者以你开始时的顺序进入大门?
基本上,同步提供排他性 - 它没有指定排序。
答案 1 :(得分:-1)
Synchronized关键字用于获取该方法对象的锁定,并在方法返回时释放它,因此一次只有一个线程可以使用该方法。并且每次都没有必要获得相同的结果,它可能会根据线程的CPU可用性产生不同的结果。
您应该阅读有关多线程的更多信息
这是a link!