java线程中常用的基本方法有wait,notify,notifyAll,sleep,join,yield等。

线程的生命周期一共分为五个部分,分别是:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。由于cpu需要在多条线程中切换因此线程状态也会在多次运行和阻塞之间切换。

线程等待(wait)

调用该方法会使线程会进入WAITING状态,只有等待另外线程的通知或者被中断才会返回,需要注意的是调用wait()方法后,会释放对象的锁,所以,wait方法一般用在同步方法或同步代码块中。wait()是Object中的方法。

线程睡眠(sleep)

调用该方法会使线程休眠,进入TIMED-WATING状态,与wait方法不同的是,sleep不会释放当前对象占用的锁。sleep是线程中的方法。

线程让步(yield)

调用该方法会使当前线程让出CPU执行时间片,与其他线程一起重新竞争CPU时间片。一般情况下,优先级高的线程有更大的可能性能成功竞争到CPU时间片,但这又不是绝对的,有的操作系统对优先级并不敏感。yield不会释放当前对象占用的锁。

线程中断(interrupt)

调用该方法会中断此线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位,可以通过isInterrupted()方法获取。这个线程本身并不会因此而改变状态。

1. 调用interrupt()方法并不会中断一个正在运行的线程。也就是说处于Running状态的线程并不会因为被中断而被终止,仅仅改变了内部维护的中断标识位而已。

2. 若调用sleep()而使线程处于TIMED-WATING状态,这时调用interrupt()方法,会抛出InterruptedException,从而使线程提前结束TIMED-WATING状态。

3. 许多声明抛出InterruptedException的方法(如Thread.sleep(long mills方法)),抛出异常前,都会清除中断标识位,所以抛出异常后,调用isInterrupted()方法将会返回false。

4. 中断状态是线程固有的一个标识位,可以通过此标识位安全的终止线程。比如,你想终止一个线程thread的时候,可以调用thread.interrupt()方法,在线程的run方法内部可以根据thread.isInterrupted()的值来优雅的终止线程。

等待其他线程终止(Join)

join()方法,等待其他线程结束。在当前线程中调用一个线程的join()方法,则当前线程转为阻塞状态,等待另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待CPU的宠幸。比如在main()方法中启动了另一个子线程a,正常的流程是两个线程同时进行,如果调用了a.join(),那么main()方法会等a线程运行结束后,才会继续进行后面的代码。

线程唤醒(notify)

调用此方法会唤醒等待线程,如果有多个线程都在此对象上等待,则会唤醒其中的一个,选择是任意的,是和wait()方法搭配使用的。线程通过调用其中一个 wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。notify() 也是Object 类中的方法 。

线程唤醒的方法还有 notifyAll() ,唤醒监视器上等待的所有线程。


线程方法总结

1. sleep():强迫一个线程睡眠N毫秒。

2. isAlive(): 判断一个线程是否存活。

3. join(): 等待线程终止。

4. activeCount(): 程序中活跃的线程数。

5. enumerate(): 枚举程序中的线程。

6. currentThread(): 得到当前线程。

7. isDaemon(): 一个线程是否为守护线程。

8. setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)

9. setName(): 为线程设置一个名称。

10. wait(): 强迫一个线程等待。

11. notify(): 通知一个线程继续运行。

12. setPriority(): 设置一个线程的优先级。

13. getPriority()::获得一个线程的优先级。

最新文章

  1. for循环每次取出一个字符(不是字节)
  2. Query Designer:Condition,根据KeyFigure值来过滤数据
  3. word20161201
  4. 分布式中,zookeeper的部署
  5. 怎样实现UIView的旋转
  6. windows分屏
  7. w3wp与w3svc
  8. 5. test命令
  9. Spring的注解@Qualifier小结
  10. Linux虚拟机部署单机solr报错500解决方法之一
  11. pandas to_html
  12. 第五章 绘图基础(BEZIER)
  13. FZU - 1688 Binary land
  14. cxgridchart饼状图
  15. CentOS7.6 如何设置静态ip
  16. 移动硬盘插到台式机,外接网卡无法连接wifi处理
  17. 为什么有的需要安全连接的的application只有开Fiddler才好用?
  18. Git克隆部分文件
  19. Oracle:oracle 12.1.0.2 升级到12.2.0.1 后,自动任务报错:ORA-20001: Statistics Advisor: Invalid task name for the current user
  20. Docker容器挂载宿主目录的情形分析

热门文章

  1. 从 SGD 到 Adam —— 深度学习优化算法概览(一) 重点
  2. gradle在build的时候找不到某个jar包的解决办法
  3. IE下form表单密码输入框可以输入中文问题
  4. UVa 1374 - Power Calculus——[迭代加深搜索、快速幂]
  5. 【u201】矩形覆盖
  6. SpringBoot 上传文件到linux服务器 异常java.io.FileNotFoundException: /tmp/tomcat.50898……解决方案
  7. Jmeter完整Demo
  8. linux Tasklets 机制
  9. 关于git命令
  10. Linux 内核 嵌入的 kobjects