这就是我要完成的!
第1步)启动th1并进入其可运行状态
第2步)在th1的可运行内容内启动th2
第3步,在可运行对象的中间,加入th2并转到th2的可运行对象
第4步),在th2的可运行状态中间,加入th1,然后精确返回我在th1的可运行状态中留下的位置
第5步)完成th1 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();
}
}
输出: 一种 乙 C d Ë F 一世 G 高
“ I”应该是输出中的最后一个。我知道为什么它以不正确的顺序显示,但是,我不知道如何以正确的顺序显示它?我已经一起使用notify()和wait()。如果我在“ alphabet2”中键入“ th1.start()”,则在“ alphabet”类之后将重新启动并显示“ A”。我也尝试过“ interrupt()”和“ sleep()”。我了解我的代码有缺陷,我仅以代码为例。
答案 0 :(得分:0)
这是基于您的代码的可能解决方案。
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");
}
}
}