java多线程之(sleep)
2016-01-21 20:26
471 查看
java的Thread.sleep()相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。 但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象。看下面这个例子就清楚了:
输出:
i:11
线程Thread-0进入睡眠状态
线程Thread-0睡眠结束
i:12
i:13
线程Thread-1进入睡眠状态
线程Thread-1睡眠结束
i:14
解释:当线程Thread-0获得对象锁并进入sleep时,线程Thread-1只能等待线程Thread-0执行完成后才能获取对象锁继续执行。
package nc.com.thread.traditional.example; /** * @ClassName: TestSleep * @Description: TODO(这里用一句话描述这个类的作用) * @author A18ccms a18ccms_gmail_com * @date 2015-12-19 下午06:41:58 * */ public class TestSleep { private int i = 10; private Object object = new Object(); public static void main(String[] args) throws Exception { TestSleep test = new TestSleep(); MyThread thread1 = test.new MyThread(); MyThread thread2 = test.new MyThread(); thread1.start(); thread2.start(); } class MyThread extends Thread{ @Override public void run() { //只要有一个线程获得了对象锁,则在当获得线程锁的线程sleep时,其他线程不能获取对象锁,只能一直等待 synchronized (object) { i++; System.out.println("i:"+i); try { System.out.println("线程"+Thread.currentThread().getName()+"进入睡眠状态"); Thread.currentThread().sleep(10000); } catch (InterruptedException e) { // TODO: handle exception } System.out.println("线程"+Thread.currentThread().getName()+"睡眠结束"); i++; System.out.println("i:"+i); } } } }
输出:
i:11
线程Thread-0进入睡眠状态
线程Thread-0睡眠结束
i:12
i:13
线程Thread-1进入睡眠状态
线程Thread-1睡眠结束
i:14
解释:当线程Thread-0获得对象锁并进入sleep时,线程Thread-1只能等待线程Thread-0执行完成后才能获取对象锁继续执行。
相关文章推荐
- JavaSE入门学习6:Java基础语法(二)
- Javah使用问题解决
- Java基础_12_正则表达式
- JAVA 中BIO,NIO,AIO的理解
- Java 编程思想 第四章个人见解---控制执行流程
- JAVA多线程之(join)
- eclipse 单机版 mahout collaborative demo
- java正则表达式
- JAVA基础(一)重载和复写
- JAVA内部类使用,什么时候该使用内部类及使用内部类的好处
- hibernate Session的几个简单方法
- flask之行(Eclipse+Pydev IDE)
- java基础学习
- java中接口和类【转】
- spring IOC
- JAVA多线程之(wait notify)
- d3结合Spring和mybatis实现数据可视化中数据库内容的树型显示
- ssh(Spring struts2 hibernate)整合
- Spring structs2 hibernate 整合(ssh)
- [Java Performance] 数据库性能最佳实践 - JPA缓存