java多线程之堵塞的应用
线程在Running的过程中可能会遇到阻塞情况,上次的内容我们已经使用过sleep()的方法。
- 调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。
- 调用wait(),使该线程处于等待池,等到线程被唤醒被放到锁定池,释放同步锁使线程回到可运行状态。
- 对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();
}
}
}
最新文章
- 常用备份工具是mysql自带的mysqldump
- Facebook React.js库 入门实例教程
- hdu1241 dfs
- JSBinding / Code Snippets
- linux包之iproute之ss命令
- Oracle用户及角色的权限管理[Oracle基础]
- 开启gdb调试功能
- 黑马程序员 --->; 正则表达式
- properties editor for eclipse安装使用
- Elasticsearch相关配置(二)
- win10 mysql详尽安装教程
- UML之时序图
- c语言 基本运算
- There are multiple modules with names that only differ in casing. 黄色warning
- bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)
- .net分布式系统架构的思路
- 【UML】:时序图
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十):接口服务整理
- 使用Homebrew在Mac OS X EI Capitan上安装与配置nginx和PHP
- python之路----黏包的解决方案