Как запустить разные методы одного и того же класса в разных потоках? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь понять, как реализовать потоки в Java.
Сейчас я знаю, что вы можете использовать интерфейс runnable с методом run для реализации потоков.

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

public class PrintState {
    private int state = 0;

    public synchronized void printNewState() throws InterruptedException {
        wait();
        System.out.println(state);
    }

    public synchronized void setValue(int v) {
        state = v;
        notify();
        System.out.println("value set");
    }
}

Я хочу иметь два потока, которые будут выполнятьсяметоды printNewState() и setValue(12) одновременно, каждый в отдельном потоке.
Как реализовать метод run() и потоки в основном методе для достижения этого?
Результат позжедолжно быть:
value set
12

1 Ответ

2 голосов
/ 01 ноября 2019

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

Вам необходимо различать потоки выполненияи код выполняется. Вы можете иметь один Runnable с одним run(), и 1000 потоков могут выполнить это Runnable. Это означает, что у вас есть 1000 потоков, выполняющих один и тот же код, хотя у вас может быть только один экземпляр Runnable для всех них.

Я хочу иметь два потока, которые запускают методы printNewState ()и setValue (12) одновременно, каждый в отдельном потоке.

Вы можете сделать что-то подобное. Примечание. Я использую лямбды для создания Runnables:

PrintState ps = new ...
Thread t1 = new Thread(ps::printNewState); //t1 will call printNewState
Thread t2 = new Thread(() -> ps.setValue(12)); //t2 will call setValue(12)
t1.start();
t2.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...