2020-08-28

                                            线程方面的考核,如线程的生命周期、线程安全问题

创建线程的几种方式?

                              

通过继承Thread类实现,多个线程之间无法共享该线程类的实例变量。

实现Runnable接口,较继承Thread类,避免继承的局限性,适合资源共享。

使用Callable,方法中可以有返回值,并且抛出异常。

创建线程池实现,线程池提供了一个线程队列,队列中保存所有等待状态的线程,避免创建与销毁额外开销,提高了响应速度。

  1. 问题扩展:

线程的生命周期:线程要经历新建、就绪、运行(活动)、阻塞和死亡五种不同的状态。这五种状态都可以通过Thread类中的方法进行控制。① 新建状态:使用new 操作符创建一个线程后,该线程仅仅是一个空对象,这时的线程处于创建状态。② 就绪状态:使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于就绪状态。③ 运行状态:系统真正执行线程的run()方法。④ 阻塞和唤醒线程阻塞状态:使用sleep(),wait()方法进行操作。⑤ 死亡状态:线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。

线程安全问题:使用synchronized声明同步或使用锁lock,Lock使用起来比较灵活,但需要手动释放和开启,采用synchronized不需要用户去手动释放锁。

                                                线程的生命周期与过程中的阻塞状态

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

线程创建方式

 

优缺点:

1.继承Thread类

优点:代码简单 。 缺点:该类无法集成别的类。

2.实现Runnable接口

优点:继承其他类。 同一实现该接口的实例可以共享资源。

缺点:代码复杂

3.实现Callable

优点:可以获得异步任务的返回值

4.线程池:实现自动化装配,易于管理,循环利用资源。

 

  1. 问题扩展:

在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?

整体上来说Lock是synchronized的扩展版,Lock提供了无条件的、可轮询的(tryLock方法)、定时的(tryLock带参方法)、可中断的(lockInterruptibly)、可多条件队列的(newCondition方法)锁操作。另外Lock的实现类基本都支持非公平锁(默认)和公平锁,synchronized只支持非公平锁,当然,在大部分情况下,非公平锁是高效的选择。

  1. 结合项目中使用:

用户登录成功之后需要记录用户连续登录天数,给用户奖励积分。可以创建一个线程,单独调用积分接口。

wait会释放锁,sleep会持有锁。wait通常被用于线程间交互,sleep通常被用于暂停执行。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值