线程(Thread)知识点概要
作者:互联网
(作者:苦行者;撰写时间:2020年12月2日)
*线程的一些主要方法:
1.thread.run():运行(线程任务)
2.thread.start():开启线程
3.thread.stop():强制结束线程(线程消亡)
4.thread.sleep(time):冻结线程,线程依旧存活,时间到就解冻,接着运行线程
5.thread.wait():彻底冻结,没有消亡还不能动,不过可以进行手动唤醒(notify()),被wait的线程会被存储到线程池里面。
6.thread.notify():唤醒线程
7.thread.notifyAll():唤醒所有线程
8.Thread.currentThread():获取当前线程
9.Thread.currentThread().getName():获取当前线程的名字
线程的运行具有对cpu的执行资格和执行权,被冻结的线程执行资格和执行权被释放;
运行状态:具备执行资格和执行权。
临时阻塞状态:具备执行资格,不具备执行权,正在等待执行权。
冻结状态:不具备执行资格和执行权。
唤醒状态:具备执行资格,暂时还不具备执行权,须等待。
CPU的执行资格:可以被cpu处理,在处理队列中排队。
CPU的执行权:正在被cpu处理。
*创建线程的两种方式:
1.第一种方式:继承Thread类,重写run()方法。
2.第二种方式:如果有父类的情况下,无法继承Thread类,那么可以通过实现Runnable接口来覆盖接口中的 run()方法,将线程任务封装到run方法中。通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递,因为线程的任务都封装在Runnable接口子类对象的run方法中,所以要在线程对象创建时就必须明确要运行的任务。最后调用线程对象的start方法开启线程。
*同步函数与同步代码块都具有解决线程安全问题的功能
Lock lock new ReentrantLock();
void show(){
try{
lock.lock();//获取锁
code…//需要同步的代码
}
finally{
lock.unlock();//释放锁—一定要放在finally里面,不管同步代码发没发生异常,都要将锁释放。
}
1、同步代码块:synchronized(Object object){ 需要同步的内容 },传入的object对象称为同步锁且必须是全局的。注意:“同步代码块的锁”可以是任意的对象。
2、同步函数:使用synchronized修饰符修饰的方法,方法体内是需要同步执行的内容。注意:“同步函数锁”是调用该方法的对象,也就是this指向的对象。
3、当同步代码块与同步函数一起使用的时候,为了保证线程的安全,两者的同步锁必须保持一致,共用this对象。建议使用同步代码块。
4、静态同步函数的锁是谁?:使用静态修饰符修饰的对象没有new的过程,因此也就没有this对象,所以静态同步函数的锁肯定不是this,它的锁是该函数所属字节码文件对象,可以通过getClass(非静态的)方法获取它的字节码文件对象,也可以用当前 类名.Class表示,当遇到第3点的情况,同步代码块可以通过获取当前对象的字节码文件对象来进行传参,即this.getClass()或类名.Class,确保“同步代码块锁”与“静态同步函数锁”是同一个对象,保证线程的安全。
5、死锁:常见死锁情况之一,同步嵌套。
6、线程间通信:多个线程在处理同一个资源,但是任务不同。
6.1、多生产者,多消费者容易产生的问题:if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。notify只能唤醒一个线程,如果本方唤醒了本方,没有意义。
解决方法:while判断标记+notifyAll。while判断标记,解决了线程获取执行权后,是否要运行。notifyAll解决了本方线程一定会唤醒对方线程的问题,避免了所有线程都被冻结的从而导致死锁的情况。注意:本方线程唤醒本方线程毫无意义,只有本方线程唤醒对方线程才有意义。while标记+notify会导致死锁。但是while判断标记+notifyAll有一个弊端,那就是降低了执行效率,因为notifyAll既唤醒了对方,也唤醒了本方,那么有什么办法既可以唤醒对方,又可以不用唤醒本方呢?当然可以,jdk1.5以后将同步和锁封装成了对象并将操作锁的隐式方法定义到了该对象中,将隐式动作变成了显示动作。使用方法如下:
}
Lock接口:替代了同步代码块或者同步函数。将同步的隐式锁操作变成了显示锁操作,同时更为灵活。可以一个锁加上多组监视器。lock():获取锁。unlock():释放锁,通常需要定义在finally代码块中。
Condition接口:替代了object中单独进行了封装,变成Condition监视器对象,可以和任意锁进行结合。await();signal();signalAll();
7、wait和sleep的区别:
(1)、wait可以指定时间也可以不指定;sleep必须指定时间。
(2)、在同步中时,对cpu的执行权和锁的处理不同。wait:释放执行权,释放锁;sleep:释放执行权,不释放锁。
标签:知识点,同步,Thread,对象,执行权,线程,唤醒 来源: https://blog.csdn.net/weixin_44541162/article/details/110494179