Java Multi-Threading получает вывод в порядке? - PullRequest
0 голосов
/ 24 ноября 2018

Может кто-нибудь помочь мне, как мы можем синхронизировать многопоточную программу Java ниже? Я изучаю Многопоточность в Java, которая является немного сложным предметом, и я получил эту проблему в Интернете и пытался решить ее, но я не могу.Например,

    public class GoMyThread {
        public static void main(String[] args) {
            MyThread t1 = new MyThread("Louis");
            MyThread t2 = new MyThread("Mathilde");
            MyThread t3 = new MyThread("Toto");
            t1.start();
            t2.start();
            t3.start();
        }
    }


    public class MyThread extends Thread {

        public MyThread(String name) {
            super(name);

        }

        public  void run() {
        for (int i = 0; i < 3; i++)
            {
                System.out.println(getName() + " Finish , level  " + (i+1));
                if (getName().compareTo("Louis") != 0)
                {
                    try{
                        Thread.sleep(100);
                    }
                    catch (InterruptedException e){}
                }
            }
        }

    }                  
 the out put for this is of the programe changes with every run 

, вывод ниже - один из них

    Louis Finish , level  1
    Louis Finish , level  2
    Louis Finish , level  3
    Toto Finish , level  1
    Mathilde Finish , level  1
    Toto Finish , level  2
    Mathilde Finish , level  2
    Toto Finish , level  3
    Mathilde Finish , level  3 

  what I want is  the output to be  like ,three of them finish level 1 before passing to the next level ,But i can't achieve it no matter i try ,the 

вывод должен выглядеть следующим образом.

    Louis Finish , level  1`
    Mathilde Finish , level  1
    Toto Finish , level  1
    Louis  Finish , level  2
    Toto Finish , level  2
    Mathilde Finish , level  2
    Toto Finish , level  3
    Mathilde Finish , level  3                                                                                  
    Louis  Finish,level  3                                                                                                   

 I  will appriciate if you give me some concepts to understand java Thread programming  too , ,Thank You! 

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Потоки выполняются параллельно по своей природе, поэтому тот факт, что вы получаете разные результаты при каждом запуске программы - это нормальное поведение .

Есть способыхотя, где вы можете заставить их работать в каком-то порядке, например, t1, вы начнете выполнять после того, как t2 будет сделано, и т. д.

, что я хочу, чтобы вывод былнапример, три из них заканчивают уровень 1, прежде чем перейти на следующий уровень, но я не могу достичь его, несмотря на все попытки, вывод

должен выглядеть следующим образом.

Louis Finish , level  1`
Mathilde Finish , level  1
Toto Finish , level  1
Louis  Finish , level  2
Toto Finish , level  2
Mathilde Finish , level  2
Toto Finish , level  3
Mathilde Finish , level  3                                                                                  
Louis  Finish,level  3

Если вы хотите этого, дайте им время, чтобы другие участники достигли того же уровня.Вот код:

public class GoMyThread {
    public static void main(String[] args) {
            MyThread t1 = new MyThread("Louis");
            MyThread t2 = new MyThread("Mathilde");
            MyThread t3 = new MyThread("Toto");
            t1.start();
            t2.start();
            t3.start();
    }

    static class MyThread extends Thread {

        public MyThread(String name) {
            super(name);
        }

        public  void run() {
            for (int i = 0; i < 3; i++){
                    System.out.println(getName() + " Finish , level  " + (i+1));
                    try{
                        // Force a sleep to give the other threads time to reach the same level
                        Thread.sleep(500);
                    }catch (InterruptedException e) {
                        System.out.println("Something went wrong with sleep");
                    }

                    if (getName().compareTo("Louis") != 0){
                        try{
                            Thread.sleep(100);
                        }
                        catch (InterruptedException e){}
                    }
            }
        }
    }
}

Результат будет всегда быть тем, что вы хотите, потому что 500 миллисекунд ожидания - это целый день для потока.

0 голосов
/ 24 ноября 2018

Вы можете использовать статический счетчик для количества потоков и добавить цикл while после печати уровня, чтобы проверить, достигнуто ли количество циклов.Вы также можете использовать общий CountDownLatch, но вам придется его сбрасывать (создавать новый) после каждого уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...