多线程复习笔记

一、多线程的创建方式一共有三种:

1、extends Thread
2、Implements Runnable
3、Implements Callable

二、线程常用的一些方法

1、run方法
2、start
3、setPriority(int)设置线程优先级别,可选范围1-10,默认为5,线程级高代表他抢到时间片的概率高
4、static sleep(long):让当前线程休眠毫秒
5、join():当前线程邀请调用方法的线程优先执行
6、setName()+getName():设置线程的名字 和 获取线程的名字
7、wait()和notify() notifyAll():第一个为该线程进入等待状态,直到另一个线程调用 notify()或者notifyAll()方法时才会醒来。notify()唤醒某个线程notifyAll()唤醒所有等待状态的线程。
8、setDaemon(true) 设置守护线程,是给其他线程提供服务的线程。发现线程只剩下守护线程时,守护线程会自动消亡。
9、static currentThread():获得当前正在执行的的线程对象

**

三、启动线程

启动线程调用的是start()方法。

当只调用run方法是他只是一个普通方法,例如在main函数里面运行了定义了线程1、2、3。那么只调用1.run()、2.run()、3.run()的话,运行的线程实际上还是main线程的,和1、2、3没有关系,这个时候线程类就相当于普通类,调用run方法,就相当于调用了一个普通类的方法。

当只允许strat方法时:这个时候会把任务的执行交给任务规划器,具体线程的执行需要等待系统去安排,任务执行的时间和顺序也是不确定的,但是这些任务肯定是你定义的线程运行的,而不像只运行run时候的现象,当前主动调用的线程不会参与这些任务的执行,例如像只运行run的情形,main不会定义线程里面的任务的。

四、sleep和wait的区别:一个是休眠后会自动醒来 第二个是需要别的线程调用唤醒的方法才会醒来

**

五、什么是死锁

**
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

**

六、synchronized和lock的区别

**
观看文章:https://blog.csdn.net/weixin_37864013/article/details/78066419
https://blog.csdn.net/ghsau/article/details/7461369

**

七、锁池和等待池的区别

**
在java中,每个对象都有两个池,锁(monitor)池和等待池

wait() ,notifyAll(),notify() 三个方法都是Object类中的方法.

锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

你可能感兴趣的:(JAVA)