nuke_infer Ответов: 2

Синхронизация потоков Java


я хочу отобразить свое имя и фамилию, используя 2 потока. Как только пользователь нажмет ctrl с какой-то клавишей, программа должна быть прекращена. Пожалуйста, посоветуйте мне начать это. вот мой код, и он отображает только один том. но я хочу отобразить это до тех пор, пока пользователь не нажмет какую-нибудь клавишу.
 class Thread_Ex11{
public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable(), "gayan");
        Thread t2 = new Thread(new MyRunnable(), "suranga");
        t1.start();
        try {
            t1.join(2000);
            t2.join(2000); 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
          
            t2.start();
            t1.start();  

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
      
        }

}

class MyRunnable implements Runnable{

    @Override
    public void run() {
       while(true){
        System.out.println(Thread.currentThread().getName());
             
       }  
  }
    
}


Что я уже пробовал:

мой выход из этой программы.
это один
это два

но я хочу выйти из игры
это один
это два
это один
это два
и т.д....
завершенный

2 Ответов

Рейтинг:
8

Richard MacCutchan

Попробуйте это, это работает для меня.

public class Thread_Ex {
    public static void main(String [] args) {
        Thread t1 = new Thread(new MyRunnable(), "gayan");
        Thread t2 = new Thread(new MyRunnable(), "suranga");
        
        t1.start();
        t2.start();
        while (true) {
            try {
                System.in.read();
                t1.interrupt();
                t2.interrupt();
            }
            catch (Exception eee) {
                //
            }
        }
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        while(true) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(200);
            }
            catch (InterruptedException zz) {
                //
            }
            
            if (Thread.interrupted()) {
                System.out.println("interrupted");
                break;
            }
        } 
    }
}


nuke_infer

это нормально,но он печатает оба значения вместе.

Richard MacCutchan

Затем вам нужно выяснить какую-то синхронизацию между двумя потоками. Может быть, мьютекс или семафор (Google найдет вам примеры).

nuke_infer

спасибо Ричард

Рейтинг:
2

Richard MacCutchan

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


nuke_infer

да, я вставляю цикл while для выполнения результата. вот код, который я вставил в цикл while
класс Thread_Ex11{
публичный статический пустота главный(строка[] аргументы) {
Thread t1 = new Thread(new MyRunnable (), " one");
Thread t2 = new Thread(new MyRunnable (), " two");
Т1.начать();
пробовать {
T1. join (2000);
T2. join(2000);
} catch (InterruptedException e) {
е.печатные();
}
Т2.начать();
Т1.начать();
пробовать {
Т1.присоединяйтесь();
Т2.присоединяйтесь();
} catch (InterruptedException e) {
е.печатные();
}
}
}
класс MyRunnable реализует Runnable{
@Ручная коррекция
общественного недействительными Run() {
в то время как (правда){
System. out.println(Thread. currentThread (). getName());
}
}
}
out put показывает
Один, Один,Один,Один,Один,Два,Два,два,один,два и т. д...

но я хочу получить ответ
один, два, один, два, один, два и т. д...

Richard MacCutchan

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

При добавлении подробной информации о вашем коде, пожалуйста, отредактируйте свой вопрос и добавьте его туда.

nuke_infer

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

Richard MacCutchan

Смотрите мое новое решение ниже