码迷,mamicode.com
首页 > 编程语言 > 详细

Java中线程状态的各种转换关系

时间:2020-07-28 22:50:50      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:notify   一起   try   暂停   判断   ali   throws   执行   ==   

 

技术图片

 

 状态1:新建一个线程并且开启start()方法,使Java线程和操作系统线程联系起来;

状态2:Running——Waiting  :调用wait方法

synchronized(lock){
    lock.wait();      //进入waiting状态,释放锁
}

synchronized(lock){
    lock.notifyAll();      //,唤醒所有线程,使所有在waiting状态的线程进入blocked状态,进入entry List队列和其他线程一起竞争锁
}

 

 

状态3Running——Waiting:调用join()方法   join()方法最终调用的也是wait方法,它使用了保护性暂停机制:当两个线程之间有关系时,比如一个线程需要等待另外一个线程的结果,t.join()所有其他的线程都必须等待t线程执行完了才能执行

public final void join() throws InterruptedException {
        join(0);
    }


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;
            }
        }
    }

 park(t)   unpark(t)  可以指定需要唤醒的线程,每一个线程都有一个parker对象 包含counter  mutex 当线程调用  大致是下面这个意思

park(t){
if(t.ounter == 0)
t.wait;
else if (t.counter == 1)
counter = 0;
}

unpark(t){
if(t.counter == 1)

}
e;se if(t.counter == 0){
t.counter = 0;
唤醒t线程
}

 

Java中线程状态的各种转换关系

标签:notify   一起   try   暂停   判断   ali   throws   执行   ==   

原文地址:https://www.cnblogs.com/guosai1500581464/p/13393796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!