java多线程之(sleep)

来源:互联网 发布:出租屋 知乎 编辑:程序博客网 时间:2024/04/29 05:45

java的Thread.sleep()相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。 但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象。看下面这个例子就清楚了:

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执行完成后才能获取对象锁继续执行。

0 0
原创粉丝点击