设为首页 加入收藏

TOP

Thread线程的基础知识及常见疑惑点(二)
2019-09-03 03:40:11 】 浏览:135
Tags:Thread 线程 基础知识 常见 疑惑
sp;           e.printStackTrace();
                    }
                    System.out.println("notify over");
                }


            }
        });
        thread.start();
        thread1.start();
    }


执行结果为:


thread获取到锁,触发wait
thread1获取到锁
1秒后唤醒
notify over
wait over


  LockSupport.park():另外还有JUC包中的park方法让当前线程等待。此方法是使用CAS实现的线程等待,不会释放锁。而park/unpark方法比wait/notify这一对好的地方在于,前者可以先unpark在park,这是线程仍然会继续执行;而对于wait/notify,则需要通过程序控制执行顺序,一定要先wait在notify/notifyAll,否则顺序反了线程就会一直等待下去,由此悲剧诞生...  比如讲上述wait/notify的代码34行35行调换一下顺序,执行结果如下所示:


thread1获取到锁
1秒后唤醒
notify over
thread获取到锁,触发wait


仿佛云天明对程心那一千八百万年的等待


    join()/yield():对于Thread下的这两个方法,之所以放在一起讲解,就是因为这两个方法平时比较少用到,属于闲云野鹤的存在。


yield()方法是让当前线程让步,让步的意思就是放弃执行权,即当前线程会从上述说的运行状态runnable中的running状态进入ready就绪状态,但是虚拟机不保证当前线程执行了yield方法后不会紧接着再次进去running状态,因为可能CPU分配执行时间时又分给了当前线程。所以这个方法其实一般也没啥用,因为效果不稳定。


join()方法是将调用join的线程插入当前线程的执行过程中,即让当前线程等待,先执行完调用join的线程,再继续执行当前线程。注意join方法不会释放锁。join的演示代码如下:


public class RunnableThread implements Runnable{
    @Override
    public void run() {
        System.out.println("runnable run");
        try {
            System.out.println("开始睡眠");
            Thread.sleep(5000);
            System.out.println("睡了5秒");
        } catch (Exception e) {
            System.out.println("runnable exception:" + e);
        }
    }


    public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();
        Thread thread = new Thread(new RunnableThread());
        thread.start();
        thread.join();
        System.out.println("end");
    }
}


执行结果为:


runnable run
开始睡眠
睡了5秒
end


结束语


    这次先到这里,上述说的东西,虽然很小,而且实际中不会直接用到,但是对于我们理解线程的运行机制、理解多线程框架都有好处,所以还是有必要在自己的学习地图上理解清楚。其实线程还有一个很重要的点就是线程的中断,多线程框架或者JUC包的源码中都会涉及到对线程中断的处理以及响应,这一块我会在后面梳理清楚了之后专门整理出来。最近觉得学习进入了停滞期,有点不知道从何下手,觉得需要学的东西太多。在这里,想跟各位道友讨教一下,一个资质普通的开发者,如何才能将自己的实力提升到一个比较高的层次(比如阿里的P6P7及以上?)欢迎留言赐教,在此不胜感激!


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇@Import与@ImportResource注解的.. 下一篇Java线程的中断

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目