Поток не снимет блокировку после ожидания () - PullRequest
0 голосов
/ 03 июня 2018

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

Я пытаюсь добиться того, чтобы вывести «1» из «Test», обработанного потоком, и «из Test 2» из «Test 2»который также обрабатывается потоком, но печатается только «1».Что мне делать?

================================

import java.util.logging.Level;
import java.util.logging.Logger;

public class Test implements Runnable {

    Third third;

    public Test(Third third){
        this.third = third;
    }

    public void run() {
        while (true) {
            synchronized (third) {
                try {
                    System.out.println("1");
                    third.wait();
                } catch (InterruptedException ex) {

                }

            }
        }
    }
}

=====================


public class Test2 implements Runnable{
    Test test;
    Third third;

    public Test2(Test test, Third third){
        this.test = test;
        this.third = third;
    }

    public void run(){
        while(true){
            synchronized(third){
                third.notifyAll();
                System.out.println("from test 2");
            }
        }
    }
}

================================

public class Third {

}

==============================

public class main {
    public static void main(String[] args) throws InterruptedException{

        Third third = new Third();
        Test test = new Test(third);
        Test2 test2 = new Test2(test, third);

        Thread t1 = new Thread(test);
        Thread t2= new Thread(test2);

        t1.run();
        t2.run();
        t2.join();
        t1.join();
    }
}

Выход

1 Ответ

0 голосов
/ 03 июня 2018

Вы не должны вызывать метод run напрямую, так как он не создаст поток. Он вызывается как обычный метод.Вместо метода run () вы должны вызвать метод start ().

Еще одна вещь, то, что вы делаете с общим ресурсом Third.Может существовать метод синхронизации, доступный из другого потока.

Имя класса должно начинаться с заглавной буквы и должно следовать за CamelCase.

public class main {public static void main (String [] args) создает исключение InterruptedException {

    Third third = new Third();
    Test test = new Test(third);
    Test2 test2 = new Test2(test, third);

    Thread t1 = new Thread(test);
    Thread t2= new Thread(test2);

    t1.start();
    t2.start();
    t2.join();
    t1.join();
}

}

...