Строки не отображаются по порядку даже после использования synchronized ()

1

Я пытался понять синхронизированную функцию, когда я заметил эту проблему. Во-первых, вот код -

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]

Пожалуйста, объясните, как строки печатаются последовательно. Заранее спасибо. :)

Теги:
multithreading
synchronized

1 ответ

5
Лучший ответ

Синхронизированный оператор только приводит к тому, что метод disp должен выполняться в целом. Поскольку вы начинаете новый поток для каждой строки, вы не можете контролировать, какой поток выполняется сначала. Хотя потоки запускаются по порядку, они не завершаются в том же порядке.

  • 0
    Можете ли вы предложить способ управления выходом?
  • 0
    взгляните на stackoverflow.com/questions/3741765/…
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню