目录
1.新建 (比如说一个类 TT 继承一个 Thread ,在new TT的时候就是创建)
2.运行(执行中又包含:就绪、执行、睡眠、等待、离开、阻塞、唤醒)
3.结束 (teminated 结束了,就不可以在start了)
多线程就是多条执行路径同时执行。
线程的实现方式:
extends Thread
implements Runnable
通过线程池的方式实现(线程池也是同这两种方式实现的)
通过箭头函数实现
实现了线程,我们就开始使用线程。使用前我们需要了解线程的状态。
线程状态:
1.新建 (比如说一个类 TT 继承一个 Thread ,在new TT的时候就是创建)
public class TT extends Thread {
@Override
public void run(){
System.out.println(" tt run ");
}
}
Thread t = new TT() 就是线程的新建
2.运行(执行中又包含:就绪、执行、睡眠、等待、离开、阻塞、唤醒)
t.start() :运行(runnable)就是把这个线程扔到CPU的等待队列里去,在运行时有分 就绪(ready)与执行(running)。在CPU的等待队列时就是 ready,当时CPU的调度调到这个线程工作的时候就是running。
当CPU的执行的这个线程(t)的时候,CPU的调度又去执行别的线程了,就会 把这个线程(t)仍回到CPU的调度队列中去,这个时候线程是挂起状态(yiled)。
在ready 与running 的之间又有好多状态变化。
sleep()这个方法的意思就是在线程执行的时候,当前睡一下,等到了时间在执行。在括号中设置休息时间,是毫秒
wait()这个方法的意思就是在线程执行时,我等会儿再行。在括号中设置休息时间,是毫秒
join() 这个方法的意思离开当前线程,执行完另一个线程,回来在执行这个线程。
锁池:假如该线程A拥有某个对象(不是类)的锁,而且其它线程需要需要调用这个对象的synchronized的方法,由于这个线程进入synchronized方法的时候,需要获取该对象锁的拥有权,但是该对象的锁的拥有权在线程A,所以这线程进入到该对象的锁池中。
等待池:假如一个线程A调用了wait()方法,同时线程A释放锁资源,同时线程A进入到这个对象的等待池中,假如一个线程调用相同对象的notify()方法,会在该对象的等待池中随机唤醒一个线程,进入到该对象的锁池中,如果调用的是notifyAll()方法,会把该对象等待池中 的所有线程放到该对象的锁池中,等待进行锁的竞争。
notify():简单理解就是随机唤醒一个。
notify():唤醒全等待的线程。