我在观察此问题时试图了解同步功能。首先,这是代码 -
SampleThread04.java
public class SampleThread04 extends Thread
{
public void disp(String s)
{
System.out.print("["+s);
try
{
Thread.sleep(1000);
}catch(Exception e){
System.out.print(e);
}
System.out.println("]");
}
}
SampleThread05.java
public class SampleThread05 implements Runnable
{
SampleThread04 d;
String s;
Thread t;
public SampleThread05(SampleThread04 d1, String s1)
{
s = s1;
t = new Thread(this);
d = d1;
t.start();
}
public void run()
{
synchronized(d){
d.disp(s);
}
}
}
ThreadDemo02.java
public class ThreadDemo02
{
public static void main(String[] args)
{
SampleThread04 st4 = new SampleThread04();
new SampleThread05(st4,"one");
new SampleThread05(st4,"two");
new SampleThread05(st4,"three");
}
}
我在运行代码时获得了不同的输出。
输出#1:
[one]
[two]
[three]
输出#2:
[three]
[one]
[two]
输出#3:
[three]
[two]
[one]
等等。
不使用synchronized(),我得到以下输出 -
[one[two[three]
]
]
这是可以理解的但是为什么当我使用synchronized()时,字符串有时会在不使用它时按顺序打印我总是得到相同的输出。输出不应该总是如下 -
[one]
[two]
[three]
请解释字符串是如何按顺序打印的。提前致谢。 :)
答案 0 :(得分:5)
synchronized语句只会导致disp
方法作为一个整体执行。由于您为每个字符串启动一个新线程,因此无法控制首先执行哪个线程。虽然线程是按顺序启动的,但它们不会以相同的顺序完成。