设为首页 加入收藏

TOP

Thread线程的基础知识及常见疑惑点(一)
2019-09-03 03:40:11 】 浏览:34
Tags:Thread 线程 基础知识 常见 疑惑

引言


相信各位道友在平时工作中已经很少直接用到Thread线程类了,现在大多是通过线程池或者一些多线程框架来操作线程任务,但我觉得还是有必要了解清楚Thread线程类中各种方法的含义,了解了底层才能更好的理解框架、应用框架。下面我就将Thread线程的相关基础点总结一二,以供观瞻。


正文


1、Thread线程的状态


其中,运行状态又包括就绪(Ready)跟正在运行(Running),区别就是是否获得了CPU的执行时间。


对于等待跟阻塞状态,需要着重说明一下,因为此处极易搞错,而且也是面试常被问到的点。等待状态,一般由Object.wait()、Thread.sleep()、Thread.join()、LockSupport.park()等方法以及这些方法带时间控制的同类方法实现线程的等待。而阻塞状态,一般是由于当前线程还未获取到独占锁且正在等待获取,此时称为阻塞。可以将等待看做主动的线程暂停执行,以为需要调用特定的方法线程才会等待;而阻塞可以看做是被动的线程暂定执行,因为线程在等着获取独占锁。


2、Thread线程的相关方法


start()方法/run()方法:有时在面试的时候,面试官会问到调用线程的start方法跟直接调用run方法有什么区别?虽然有的道友看到这里会觉得问这种问题的面试官有点很没必要,但我还是说一下。调用start方法后,最终会调用Thread类中的一个本地方法start0,这个方法可以新建一个线程来运行你的run方法,而调用run方法后只是在当前线程上运行你的run方法,并没有新线程参与。


wait()方法/sleep()方法:请注意,这里很多人都会记错,wait方法以及跟它配套的notify/notifyAll方法,是位于顶级父类Object下的,而其他操作线程的方法都在Thread线程类下。为什么要将wait方法放在Object下呢?其实这是由wait/notify方法的实现原理决定的。wait方法调用了之后,会释放锁,并让当前线程等待,而对于java的原生锁synchronized,是隶属于一个特定对象的监视器monitor的,那这个释放的是锁谁的锁?不能是别人的,只能是调用wait方法的那个对象的。而这个锁是哪里来的?要释放锁,肯定之前加过锁,在哪里加的呢?只能是在synchronized块中给这个对象加的,所以这也解释了为什么wait/notify方法一直要跟synchronized一起用,因为它俩就是通过操作对象的锁实现的等待和唤醒。相比而言sleep方法单纯很多,它只是让当前线程睡眠一段时间,并不会涉及到对锁的操作,所以直接放在Thread类中就行。对于wait跟notify的演示如下:


public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (obj) {
                    try {
                        System.out.println("thread获取到锁,触发wait");
                        obj.wait();
                        System.out.println("wait over");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (obj) {
                    try {
                        System.out.println("thread1获取到锁");
                        Thread.sleep(1000);
                        System.out.println("1秒后唤醒");
                        obj.notify();
                    } catch (Exception e) {
            &nb
Thread线程的基础知识及常见疑惑点(一) https://www.cppentry.com/bencandy.php?fid=54&id=249484

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