多线程知识


前言

多线程

一、创建线程有哪几种方式??

a.继承 Thread 类;
b.实现 Runnable 接口;
c. 实现Callable接口;
d. 使用线程池。

二、多线程的状态

在这里插入图片描述
在这里插入图片描述

三、什么是线程死锁?

多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

1.死锁的几个四个条件

1.互斥条件:该资源任意一个时刻只由一个线程占用。
在这里插入图片描述
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
在这里插入图片描述
3.不剥夺条件:线程已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
在这里插入图片描述

4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
在这里插入图片描述

2.如何避免死锁?

既然产生死锁需要上述的四个条件,那只需要破坏产生死锁的四个条件中的其中一个就可以避免死锁:
破坏互斥条件 :这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。
破坏请求与保持条件 :一次性申请所有的资源。
破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
破坏循环等待条件 :靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
1.避免一个线程同时获得多个锁。
2.避免一个线程在锁内占用多个资源,确保一个线程只占用一个资源。
3.尝试使用定时锁。

3. sleep() 方法和 wait() 方法区别和共同点

区别:
1.sleep 方法没有释放锁,而 wait 方法释放了锁 。
2.Wait 通常被用于线程间交互/通信,sleep 通常被用于暂停执行。
3.wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用 wait(long timeout)超时后线程会自动苏醒。
相同:两者都可以暂停线程的执行。

4.为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法

new 一个 Thread,线程进入了新建状态;调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行

四、Runnable和Callable区别

Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在 JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。

五、Java中notify 和 notifyAll有什么区别?

notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它用处比较大。而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。

六、线程池的七大参数

1.corePoolSize:线程池中的常驻核心线程数
2.maxinumPoolSize:线程池中能够容纳同时执行的最大线程数,此值必须大于等于一
3.keepAliveTime:多余的空闲线程的存活时间。
当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。
4.unit:keepAliveTime的单位
5.workQueue:任务队列,被提交但是尚未被执行的任务。
6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。
7.handler:拒绝策略,表示当队列满了并且工作线程-大于等于线程池的数量最大线程数(maxinumPoolSize)时如何来拒绝请求执行的runnable的策略。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值