Я пытался понять синхронизированную функцию, когда я заметил эту проблему. Во-первых, вот код -
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]
Пожалуйста, объясните, как строки печатаются последовательно. Заранее спасибо. :)
Синхронизированный оператор только приводит к тому, что метод disp
должен выполняться в целом. Поскольку вы начинаете новый поток для каждой строки, вы не можете контролировать, какой поток выполняется сначала. Хотя потоки запускаются по порядку, они не завершаются в том же порядке.