我如何打印线程状态?
How i can print thread status?
任务:
依次覆盖子流的状态并打印到控制台(可能通过中间状态):BLOCKED WAITING TERMINATED 方法Thread.sleep() 不使用。
我的代码:
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());
}
}
}
任务: 依次覆盖子流的状态并打印到控制台(可能通过中间状态):BLOCKED WAITING TERMINATED 方法Thread.sleep() 不使用。
我的代码:
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());
}
}
}