多线程的相关问题

1. 线程的实现/创建方式

①继承Thread类;②实现Runnable接口;③实现Callable接口;④通过线程池来创建线程

2. 线程的生命周期

新建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、死亡(dead)

3.终止线程的4种方式

①等待run或者call方法执行完毕

②使用标志位终止线程

③使用interrupt来中断线程,当线程不存在阻塞时,程序中判断线程是否中断Thread.isInterrupted(),如果中断则结束执行;

当线程存在阻塞时,子线程会抛出异常,可以在程序中捕获异常并退出

④使用stop方法终止线程(不建议),调用该方法后会抛出ThreadDeatherror错误,并且子线程释放所持有的锁,导致保护的数据呈现不一致性

4. 产生死锁的原因以及解决方案

必要条件:互斥性、请求和保持条件、不剥夺、循环等待;

原因:竞争不可抢占性资源、竞争可消耗资源引起的死锁、进程请求和释放资源顺序不当

解决方案:加锁顺序,加锁时限,死锁检测

5. Synchronized和Lock的区别

Synchronized为java内置的关键字,Lock作为java相关jar包下的一个接口

Synchronized可以修饰方法、代码块;Lock只能锁定相关的代码块

Synchronized锁定的任务执行完成或者代码抛出异常时,锁自动释放;Lock加的锁必须手动进行释放

Lock锁可以中断,且Lock加锁时可以返回加锁的状态;Synchronized加锁均不可以实现

Lock加锁可以是公平锁也可以是非公平的(ReentrantLock的构造函数中可以指定该锁为公平锁)

6. sleep和wait的区别

sleep为Thread的静态方法;wait为object对象的方法

sleep可以设置阻塞的时间,并且阻塞时只释放占用的CPU资源,并不释放锁;wait也可以设置阻塞时间,不设置时间时需要通过其他线程调用notify或者notifyAll方法进行取消阻塞

sleep调用时无要求,wait只能在同步代码块中进行调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值