目录
一、进程和线程的区别
1.区别:



2.关系

二、start和run方法的区别
1.区别

2.源码层面:
Thread 继承 Runnable 接口
Runnable接口里面包含run抽象方法
因此使用Thread总是要重写run方法;
3.代码演示:
(1)使用extends Thread


多线程交替执行:

(2)使用implements Runnable

没有start方法

只有使用new Thread(Runnable)才会有start方法

4.Thread和Runnable的关系

Runnable的 优势,只要类都去继承他,就可以有很好的复用性
三、如何实现处理线程的返回值
1.如何给run()方法传参

2.如何实现处理线程的返回值

(1)主线程等待法


缺点是需要自己写,并且不知道具体需要等待多久
(2)join

Join的缺点是粒度不够细
(3)通过线程池

四、线程的状态
1.六个状态

2.其中的无限期等待

3.其中的限期等待

4.注意:已经结束的线程不能再次调用

五、sleep/wait notify/notifyAll
1.sleep/wait
(1)基本差别

(2)本质差别

注:
Sleep和wait除了可以通过设定执行时间,当时间到达时释放锁(不设置时间是无限等待)也可以通过notify和notifyall来唤醒
2. notify/notifyAll
(1)EntryList和WaitSet


(2)notify/notifyAll的区别

(3)yield

->他不会对锁的状态造成印象
五、如何中断线程
1.抛弃的方法

2.目前使用


六、线程状态以及状态之间的转换

通过实现runnable接口,或者继承Thread可以得到一个线程类,通过new一个实例,线程就进入到了new状态,也就是新建的状态,此时调用start方法,此线程即进入可运行(runnable)的状态,若处于该状态的线程被OS选中,并获得了时间片之后,就会进入到running的状态。
刚刚我们注意到,程序里面打印,并没有区分runnable和running这两个状态,所以running的状态仅仅是逻辑上的划分,如果running状态的线程一旦调用的yield方法,则可能让出cpu回到runnable的状态,当然这取决于操作系统的调度,yield只是起到了一个建议的状态。而如果时间片用完了,但是线程还没有结束,也会进入到可运行的状态。
如果处于running状态的线程如要要等待用户的IO输入,或者调用sleep方法之后,则会进入阻塞状态,此时只会让出CPU,如果当前线程已经获得锁,上述情况不会对锁的状态造成影响,不会释放已经获得的锁。
此外,处于runnable或者running状态的线程,执行synchronized方法,或者方法块的时候,发现并未获取到相应的锁,也会进入到阻塞的状态,同时会被放入到锁对象的锁池当中。在其所处的领域内只能有一个线程来执行。
而如果处于运行中的线程,调用了wait的方法,就会进入到限期或者非限期的等待状态,同时会被放入到锁对象的等待队列当中,处于等待队列中的线程,如果wait的时间到了,或者被其他线程调用notify、notifyAll,则会被放入到锁池,之后位于锁池的线程一旦获得了锁,则再次进入到runnable的状态,等待OS选中后会回到运行,即running的状态。
最后,处于running状态的线程在方法执行完毕或者异常退出之后,线程就会结束,进入到terminative的状态。
线程与进程详解
4497

被折叠的 条评论
为什么被折叠?



