线程在Running的过程中可能会遇到阻塞情况,上次的内容我们已经使用过sleep()的方法。

  1. 调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。
  2. 调用wait(),使该线程处于等待池,等到线程被唤醒被放到锁定池,释放同步锁使线程回到可运行状态。
  3. 对Running状态的线程加同步锁使其进入,同步锁被释放进入可运行状态。

此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。

1.sleep()的应用:

我们知道sleep()是睡眠一段时间,然后再开始运行。

public void run() {
for(int i=0;i<10;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Wolf");
}
}

2.wait()方法实现线程阻塞的方法,我们称之为“线程等待”,方式有两种:

1)和sleep()方法一样,通过传入“睡眠时间”作为参数,时间到了就“醒了”;

2)不传入时间,进行一次“无限期的等待”,只用通过notify()方法来“唤醒”。

public static void main(String[] args) {
ThreadA t1 = new ThreadA("t1");
synchronized(t1) {
try {
// 启动“线程t1”
System.out.println(Thread.currentThread().getName()+" start t1");
t1.start();
// 主线程等待t1通过notify()唤醒。
System.out.println(Thread.currentThread().getName()+" wait()");
t1.wait(); // 不是使t1线程等待,而是当前执行wait的线程等待
System.out.println(Thread.currentThread().getName()+" continue");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

最新文章

  1. 常用备份工具是mysql自带的mysqldump
  2. Facebook React.js库 入门实例教程
  3. hdu1241 dfs
  4. JSBinding / Code Snippets
  5. linux包之iproute之ss命令
  6. Oracle用户及角色的权限管理[Oracle基础]
  7. 开启gdb调试功能
  8. 黑马程序员 ---&gt; 正则表达式
  9. properties editor for eclipse安装使用
  10. Elasticsearch相关配置(二)
  11. win10 mysql详尽安装教程
  12. UML之时序图
  13. c语言 基本运算
  14. There are multiple modules with names that only differ in casing. 黄色warning
  15. bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)
  16. .net分布式系统架构的思路
  17. 【UML】:时序图
  18. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十):接口服务整理
  19. 使用Homebrew在Mac OS X EI Capitan上安装与配置nginx和PHP
  20. python之路----黏包的解决方案

热门文章

  1. vscode中添加git
  2. Linux高效数据统计命令wc
  3. redis使用总结(一)(redis客户端使用)
  4. mask rcnn input数据理解
  5. springboot整合redis(简单整理)
  6. iframe父子操作
  7. Spring cloud Greenwich Eureka
  8. 通过KSoap三方插件解析WebService接口方法
  9. Bootstrap3基础 栅格系统 1行最多12列
  10. 自动化测试系列:将常用的Android adb shell 命令行封装为C#静态函数