Это то, чего я хочу добиться!
шаг 1) Запустите th1 и перейдите к его запускаемому
шаг 2) запустите th2 внутри исполняемого файла th1
шаг 3) в середине runnable присоединитесь к th2 и перейдите к runnable th2
шаг 4) в середине runnable th2 присоединитесь к th1 и вернитесь туда, где я оставил в th1 runnable
шаг 5) после завершения th1 runnable вернитесь к th2 runnable именно там, где я оставил, и закончите th2 runnable
шаг 6) программа заканчивается
Шаги 4 и 5 - моя проблема. Я не могу их правильно выполнить.
public class Threads2 {
class alphabet1 implements Runnable {
@Override
public void run() {
alphabet2 alpha2= new alphabet2();
Thread th2 = new Thread(alpha2);
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("D");
th2.start();
try {
th2.join();
}catch (InterruptedException e) {
}catch (IllegalMonitorStateException e1){
System.out.println("Thread interrupted!");
}
System.out.println("G");
System.out.println("H");
}
}
class alphabet2 implements Runnable {
@Override
public void run() {
alphabet alpha= new alphabet();
Thread th1 = new Thread(alpha);
System.out.println("E");
System.out.println("F");
try {
th1.join();
}catch (InterruptedException e){
}catch (IllegalMonitorStateException e1){
System.out.println("Thread interrupted!");
}
System.out.println("I");
}
}
public static void main(String[] args){
Threads2 obj = new Threads2();
alphabet1 alpha = obj.new alphabet1();
Thread th1 = new Thread(alpha);
th1.start();
}
}
ВЫВОД: А B C D E F я г ЧАС
«I» должно быть последним в выводе. Я знаю, почему он отображается в неправильном порядке, однако я не могу понять, как отобразить его в правильном порядке? Я использовал notify () и wait () вместе. Если я наберу «th1.start ()» внутри «алфавита2», то после «алфавита» класс перезапустится с печатью «А». Я также пробовал "прерывание ()" и "сон ()". Я понимаю, что в моем коде есть недостатки, я просто использую этот код в качестве примера.
Как распечатать алфавиты по порядку
System.out.println("A B C D E F G H I");Да, я мог бы сделать это одной строкой, но дело в том, чтобы сделать это с разделением определенных алфавитов. Как я могу изменить его порядок с помощью потоков?




Это возможное решение, основанное на вашем коде.
public class Main {
private static final Object LOCK = new Object();
public static void main(String[] args) {
alphabet1 alpha = new alphabet1();
new Thread(alpha).start();
}
static class alphabet1 implements Runnable {
@Override
public void run() {
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("D");
try {
synchronized (LOCK) {
alphabet2 alpha2 = new alphabet2();
new Thread(alpha2).start();
LOCK.wait();
}
} catch (InterruptedException | IllegalMonitorStateException e) {
e.printStackTrace();
}
System.out.println("G");
System.out.println("H");
try {
synchronized (LOCK) {
LOCK.notifyAll();
}
} catch (IllegalMonitorStateException e) {
e.printStackTrace();
}
}
}
static class alphabet2 implements Runnable {
@Override
public void run() {
System.out.println("E");
System.out.println("F");
try {
synchronized (LOCK) {
LOCK.notifyAll();
LOCK.wait();
}
} catch (InterruptedException | IllegalMonitorStateException e) {
e.printStackTrace();
}
System.out.println("I");
}
}
}
Спасибо! Я очень ценю это! Это идеально! К сожалению, я не могу проголосовать, но вы отлично поработали!
@ezg Но вы понимаете, почему и как это работает, и почему у вас не работает? Копирование его в домашнее задание - всего лишь временное решение ...
Нет, не знаю. Но мне придется это исследовать. Это не совсем моя домашняя работа, в любом случае это больше для меня.
@ezg - вы может принимаете ответы, которые лучше всего отвечают на ваш вопрос
@ezg Если вы чего-то не понимаете, не стесняйтесь спрашивать. И, как указал креасе, вы можете принять ответ.
В чем вопрос?