任务: 依次覆盖子流的状态并打印到控制台(可能通过中间状态):BLOCKED WAITING TERMINATED method Thread.sleep() not to use.
我的代码:
public class Test {
private static final Object M = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread() {
public void run() {
synchronized(M) {
try {
M.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
synchronized(M) {
System.out.println(t.getState());
M.notify();
M.notifyAll();
}
System.out.println(t.getState());
System.out.println(t.getState());
t.join();
synchronized(M) {
M.notify();
M.notifyAll();
System.out.println(t.getState());
}
}
}
结果:
问题: 请帮助如何使其出现在给定的序列中:BLOCKED WAITING TERMINATED
最佳答案
这是解决方案:
public class Test {
private static final Object M = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread() {
public void run() {
try {
synchronized(M) {
M.notifyAll(); // notify before you stay on wait
M.wait();
M.notifyAll();
M.wait();
M.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
synchronized(M) { // you need to lock M before start thread
t.start();
M.wait(); //wait and notifyAll need for make sure before thread t already get lock M and will blocked next time
M.notifyAll();
System.out.println(t.getState()); //BLOCKED
M.wait();
System.out.println(t.getState()); //WAITING
M.notifyAll();
}
t.join();
synchronized(M) {
M.notifyAll();
System.out.println(t.getState());
}
}
}
关于java - 我如何打印线程状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60286826/