繁体   English   中英

我如何打印线程状态?

[英]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());
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM