zoukankan      html  css  js  c++  java
  • sleep(),wait(),yield()和join()方法的区别

    sleep()
      sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级 的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步 块,其他线程仍然不能访问共享数据。
      
    wait()
      wait()方法需要和notify()及notifyAll()两个方法一起介绍,这三个方法用于协调多个线程对共享数据的存取,所以必须在 synchronized语句块内使用,也就是说,调用wait(),notify()和notifyAll()的任务在调用这些方法前必须拥有对象的 锁。注意,它们都是Object类的方法,而不是Thread类的方法。
      wait()方法与sleep()方法的不同之处在于,wait()方法会释放对象的“锁标志”。当调用某一对象的wait()方法后,会使当前线程 暂停执行,并将当前线程放入对象等待池中,直到调用了notify()方法后,将从对象等待池中移出任意一个线程并放入锁标志等待池中,只有锁标志等待池 中的线程可以获取锁标志,它们随时准备争夺锁的拥有权。当调用了某个对象的notifyAll()方法,会将对象等待池中的所有线程都移动到该对象的锁标 志等待池。
      除了使用notify()和notifyAll()方法,还可以使用带毫秒参数的wait(long timeout)方法,效果是在延迟timeout毫秒后,被暂停的线程将被恢复到锁标志等待池。
      此外,wait(),notify()及notifyAll()只能在synchronized语句中使用,但是如果使用的是 ReenTrantLock实现同步,该如何达到这三个方法的效果呢?解决方法是使用ReenTrantLock.newCondition()获取一个 Condition类对象,然后Condition的await(),signal()以及signalAll()分别对应上面的三个方法。

    yield()
      yield()方法和sleep()方法类似,也不会释放“锁标志”,区别在于,它没有参数,即yield()方法只是使当前线程重新回到可执行状 态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行,另外yield()方法只能使同优先级或者高优先级的线程得到执行机会,这也 和sleep()方法不同。

    join()
      join()方法会使当前线程等待调用join()方法的线程结束后才能继续执行,例如:

    package concurrent;
    
    public class TestJoin {
    
        public static void main(String[] args) {
            Thread thread = new Thread(new JoinDemo());
            thread.start();
    
            for (int i = 0; i < 20; i++) {
                System.out.println("主线程第" + i + "次执行!");
                if (i >= 2)
                    try {
                        // t1线程合并到主线程中,主线程停止执行过程,转而执行t1线程,直到t1执行完毕后继续。
                        thread.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        }
    }
    
    class JoinDemo implements Runnable {
    
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程1第" + i + "次执行!");
            }
        }
    }

    程序运行结果如下:

    image_1b8jnbokkmua1q4n16kf2et1lbs9.png-140.6kB

    原文转载:http://blog.csdn.net/xiangwanpeng/article/details/54972952

  • 相关阅读:
    虚拟机(VM) windows server2003 里终于有声音了 Kenny
    web 打印 webrower 控件的ExecWB 及 兼容IE6 IE7 IE8 打印 办法 Kenny
    周三了,工作状态还没调回来 Kenny
    [转]javascript 异步调用 后台.cs里的方法 PageMethods如何使用 Kenny
    FLASHSPI
    函数指针的使用:使程序跳转到Flash指定位置
    关于内存对齐
    SD卡实验:神舟IV
    LCD 横屏竖屏
    全局变量、局部变量、静态全局变量、静态局部变量的区别
  • 原文地址:https://www.cnblogs.com/AndyAo/p/8252052.html
Copyright © 2011-2022 走看看