Thread.sleep()与Thread.yield()的区别与联系

来源:互联网 发布:zuk z2 相机软件 编辑:程序博客网 时间:2024/06/10 06:08

在JAVA并发程序的开发中,经常会用到这两个方法对程序进行测试,它们的相同点在于:
1. 都会暂缓执行当前线程;
2. 如果已经持有锁,那么在等待过程中都不会释放锁;

不同点在于:
1. Thread.sleep()可以精确指定休眠的时间,而Thread.yield()依赖于CPU的时间片划分,在我的电脑上大约为20微秒;
2. Thread.sleep()会抛出中断异常,且能被中断,而Thread.yield()不可以;

示例程序如下:

static class YieldLock extends Thread {    private Object monitor;    /**     * @param monitor     */    @Inject    public YieldLock(Object monitor) {        this.monitor = monitor;    }    public void run() {        synchronized (monitor) {            while(true) {                Thread.yield();             }        }    }}static class MonitorLock extends Thread {    private Object monitor;    /**     * @param monitor     */    @Inject    public MonitorLock(Object monitor) {        this.monitor = monitor;    }    public void run() {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        synchronized (monitor) {            System.out.println("我能拿到锁!");        }    }}/** * @param args */public static void main(String[] args) {    final Object monitor = new Object();    new YieldLock(monitor).start();    //  下面的这个线程永远拿不到锁    //  所以也不会输出"我能拿到锁!"这句话    new MonitorLock(monitor).start();}
阅读全文
0 0
原创粉丝点击