• Java并发:join与wait


      Thread.join中使用Object.wait实现:

      //java.lang.Thread
    
        public final synchronized void join(long millis)
        throws InterruptedException {
            long base = System.currentTimeMillis();
            long now = 0;
    
            if (millis < 0) {
                throw new IllegalArgumentException("timeout value is negative");
            }
    
            if (millis == 0) {
                while (isAlive()) {
                    wait(0);
                }
            } else {
                while (isAlive()) {
                    long delay = millis - now;
                    if (delay <= 0) {
                        break;
                    }
                    wait(delay);
                    now = System.currentTimeMillis() - base;
                }
            }
        }
    

      wait方法,jdk文档中的解释时:Causes the current thread to wait ,wait方法会让当前线程从runnable变成waitting的状态。怎么理解这句话呢?首先每个对象都可以作为一个锁,wait方法是根类Object的方法,每个对象都有其wait方法,在main方法中执行如下代码:

    public class Program{
        public static void main(String[] args) throws Exception{
            MyThread myThread = new Thread(new Runnable(){
                @Override
                public void run() {
                    //this就是当前对象myThread,同步获取到myThread锁
                    synchronized (this) {
                        this.notify();//唤醒在myThread锁上等待的单个线程。即main主线程从waitting变成runnable,main方法继续执行
                    }
                }
            });
            myThread.setName("myThread");
            myThread.start();
            //同步获取到myThread锁
            synchronized (myThread) {
                //使当前线程(main)从runnable进入waitting状态,等待其他某个线程调用myThread锁的 notify方法
                myThread.wait();
            }
    }
    

      myThread对象就是一个锁,main方法synchronized (myThread)获取到锁,并执行该锁的wait方法,使main线程一直等待,当线程MyThread中获取同一个锁,并执行该锁的notify方法,使之前因该锁等待main方法可以继续执行。

  • 相关阅读:
    第二周学习总结
    调查问卷
    第五周学习总结
    基于DevExpress的项目窗体统一换肤
    一个Linq to Sql 的关联小问题,搞死人
    VC中类型转换(转载)
    保证一个程序只运行一次
    给所有的Control添加发送键盘事件Tab事件,实现回车键自动跳转到下一个控件[基于Shark Xu]
    遍历进程
    CSS Friendly ASP.NET 2.0 Control Adapters (Beta 2.0)在处理URL时的一个Bug
  • 原文地址:https://www.cnblogs.com/junlu/p/12466500.html
Copyright © 2020-2023  润新知