Java多线程技能

阅读:526
作者:majingjing
发布:2020-11-16 20:32:33

Java多线程技能

在Java中有3种方法可以使正在运行的线程终止运行:

  1. 使用退出标志使线程正常退出
  2. 使用stop()方法强行终止线程,但是这个方法不推荐使用, 因为stop()suspend()resume()一样,都是作废过期的方法,使用它们可能发生不可预料的结果
  3. 使用interrupt()方法中断线程

this.interrupted()和this.isInterrupted()两个方法的区别

  1. this.interrupted():测试当前线程师傅已经使中断状态,执行后具有清除状态标志值为false的功能
  2. this.isInterrupted():测试线程Thread对象是否已经使中断状态,不清除状态标志

停止线程

  1. 如果线程在sleep状态下停止,则该线程会进入catch语句,并且清除停止状态值,变成false
  2. 不管其调用的顺序,只要interrupt()和sleep()方法碰到一起就会出现异常:
    • 在sleep状态执行interrupt()方法会出现异常
    • 调用interrupt()方法给线程打了中断的标记,再执行sleep()方法也会出现异常
  3. stop()方法呈删除线程状态,是不再被采用的方法,原因是stop()方法容易造成业务处理的不确定性
    • 在任意时机对A线程调用stop()方法,A线程并不能确定在哪里被停止了
    • 因为如果暴力性地强制让线程停止,则一些清理性对工资可能得不到完成,或者数据添加不完整
  4. 将interrupt()方法与抛异常法结合实现停止线程, 因为在catch块中可以对异常对信息进行统一对处理

暂停线程

暂停线程意味着此线程还可以恢复运行,在Java多线程中,可以使用suspend()方法暂停线程,使用resume()方法来恢复线程的执行

  • 如果suspend()方法与resume()方法使用不当,极易造成公共同步对象被独占,其他线程无法访问公共同步对象的结果

要想实现对线程进行暂停与恢复对处理,可使用wait(),notify()或notifyAll()方法

yied()方法

对作用是放弃当前对cpu资源,让其他任务去占用cpu执行时间,放弃的时间不确定,有可能刚刚放弃,马上有获得cpu时间片

线程优先级的继承特性

  1. 线程的优先级具有继承性
    • A线程启动B线程,则B线程的优先级与A线程是一样的
  2. spu尽量将执行资源让给优先级比较高的线程

守护线程

Java中有两种线程: 守护线程, 非守护线程(用户线程)

  1. 守护线程是一种特殊的线程,当进程中不存在非守护线程来,则守护线程自动销毁.

    典型的守护线程是垃圾回收线程 只有当最后一个非守护线程结束时,则守护线程随着JVM一同结束工作

  2. 即当最后一个用户线程销毁来,守护线程退出,进程也随即结束了


Reference : Java Multi-thread Programming (Second Edition)