`
bingzhen66
  • 浏览: 36763 次
文章分类
社区版块
存档分类
最新评论

36.黑马程序员-停止线程、守护线程

 
阅读更多

------- android培训java培训、期待与您交流! ----------

一、中断线程
1.stop(); //过时,有bug强制停止
2.如何停止线程?
  • 只有一种办法,run方法结束。
  • 而run方法,一般由循环控制,只要控制循环就能使线程结束。
  • 特殊情况:当线程处于冻结状态,就不会读取到标记,那么现成不会结束。
  • 这时,可以使用Thread类中的interrupt()方法,这个方法将处于冻结状态的线程强制恢复运行。这个方法不是结束线程。例如:wait()、sleep()把线程催眠,一砖头下去把线程唤醒,但是受伤(抛出InterruptExceprion)。
  • 方法流程:要结束发生中断的线程,首先使用Thread类中的interrupt()方法,这个方法会抛出中断异常,捕获异常的代码中改变标记即可。
二、守护线程setDaemon
  1. 所谓的后台线程就是指为其他线程服务的线程,也称为守护线程
  2. 使用方法:线程对象.setDaemon(true);必须在线程开启前。
  3. 守护线程setDaemon:后台线程(平常所见都是前台线程),开启后和前台线程cpu资源。结束才有区别,前台线程都结束了后台线程自动结束(还要考虑代码的实现)。只要有一个前台线程没结束就不会结束生命周期。
  4. 通常情况下,由前台线程建立的新线程仍为前台,后台建立的新线程仍为后台。
  5. JVM中的垃圾回收线程就是典型的后台线程。
三、join()方法
  1. join:线程加入。
  2. 使用方法:线程对象.join(); 位置在线程对象start之后。
  3. 作用:join的线程会申请抢夺cpu执行权,而别的线程冻结直到join线程结束。
  4. 用途:多线程中,满足条件的话可以临时加入一个线程。
  5. 其实Join 方法实现是通过wait (小提示:Object 提供的方法)。 当main 线程调用t.join 时候,main 线程会获得线程对象t 的锁 (wait 意味着拿到该对象的锁), 调用该对象的wait( 等待时间) ,直到该对象唤醒main 线程,比如退出后。

  6.   这就意味着main 线程调用t.join 时,必须能够拿到线程t 对象的锁 ,如果拿不到它是无法wait 的,刚开的例子t.join(1000) 不是说明了main 线程等待1 秒,如果在它等待之前,其他线程获取了t 对象的锁,它等待时间可不就是1 毫秒了。

三、优先级

  1. 优先级共10级, 通常使用1.5.10,可以使用常量表示 MAX_PRIORITY、 NORM_PRIORITY、MIN_PRIORITY
  2. 所有线程包括main()都默认5。
  3. 使用方法:线程对象.setPriority(Thread.MAX_PRIORITY);
  4. 优先级相对抢CPU高一些。
四、yield()方法
  1. public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
  2. 使用方法:Thread.yield();
  3. 作用:运行到yield()时线程暂停,运行其他线程,多个线程有yield()时,线程交替平均运行
  4. 用途:






分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics