美文网首页
同步模式之保护性暂停

同步模式之保护性暂停

作者: 抬头挺胸才算活着 | 来源:发表于2020-03-16 16:52 被阅读0次
  • 同步模式之保护性暂停
    就是一个线程等待另外一个线程的结果。
public class GuardedObject{
    private Object object;
    private boolean ready = false;

    synchronized public Object get(){
        while(!ready){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return object;
    }

    synchronized public Object get(long timeout){
        long left;
        long startTs = System.currentTimeMillis();
        while(!ready){
            left = startTs + timeout - System.currentTimeMillis();
            if(left<=0){
                return null;
            }

            try {
                // wait不一定会等待left这么长的时间,因为可能会被打断
                wait(left);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return object;
    }

    synchronized public void complete(Object object) {
        this.object = object;
        notifyAll();
    }

    public static void test(){
        GuardedObject GO = new GuardedObject();
        Thread t1 = new Thread(
                ()->{
                    System.out.println("等待结果...");
                    GO.get(500);
                    System.out.println("得到结果...");
                }
        );
        t1.start();

        Thread t2 = new Thread(
                ()->{
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("发送结果...");
                    GO.complete(new Object());
                }
        );
        t2.start();
        try {
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

相关文章

网友评论

      本文标题:同步模式之保护性暂停

      本文链接:https://www.haomeiwen.com/subject/lmknehtx.html