Thread各方法适用情况

sleep()

try {
     Thread.sleep(2000);
} catch (InterruptedException e) {
     e.printStackTrace();
}
SystemClock.sleep(2000);

sleep()方法会使线程睡眠,交出CPU给其他线程使用。

注意:sleep()方法不会释放锁。

上述第二个方法为Android独有,两者的区别就为是否catch InterruptedException,欲知该异常的作用,请见interrupt()方法。先说结果,该方法屏蔽了interrupt通知。

interrupt()

Thread thread = new Thread() {
    @Override
    public void run() {
        for (int i = 0; i < 1000000; i++) {
            if (Thread.interrupted()) {
                // 收尾
                return;
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                // 收尾
                return;
            }
        }
    }
};
thread.start();
SystemClock.sleep(1000);
thread.interrupt();

了解interrupt()之前,我们先讲一下被弃用的stop()方法。

stop()方法调用后会立即结束线程,而不管线程此时在做何事情。这就会引发不可预知的问题,假如线程正在对一个int型变量赋值,刚写完高位地址准备写低位地址,此时stop()方法来了,线程停止,那这个变量的值可就天知道了。

所以,请使用interrupt()方法代替stop()方法

interrupt()方法不会立即结束线程,而会通知线程“你需要中断了”,那么线程接收到中断通知后,什么时候执行呢?有三种情况:

  1. Thread.interrupted()

    interrupted()方法会拦截该通知,让用户进行一系列收尾工作。

  2. InterruptedException

    还记得上面sleep()方法中的异常吗?就是这个货。这货会在线程是空闲的情况下拦截该通知并进行收尾工作,毕竟线程空闲着,也不会搞事情。

    注意:这可不是报错,并不是所有的异常都是错误信息。

  3. 线程:“哦,我接收到了”,然后就没有然后了。

wait()/notify()/notifyAll()

private synchronized void initString() {
    sharedString = "Woong === ";
    notifyAll();
    //notify()
}

private synchronized void printString() {
    //不能是if,因为notify()后会直接执行wait()后面的代码,可能会造成判断失效
    while (sharedString == null) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("String: " + sharedString);
}

当线程执行wait()后,线程会释放锁,并进入到阻塞。

当收到notify()方法后,该线程会等待获取锁,获取锁后则会执行wait()之后的代码段

当有多个线程(同一个锁)进入wait()时,notify()只会通知一个线程,其他线程继续wait()。要想通知所有线程,需使用notifyAll()。

wait()方法会释放锁。

join()

假设有两个线程thread1和thread2,在thread1中调用thread2.join(),则会让thread1阻塞,开始执行thread2,只有当thread2结束后,才会继续运行。

可以简单的概括为,join()方法让线程串行运行。

join()内部调用了wait()方法,所以会释放锁。

yield()

该方法很少用到,它会让线程停一下,对,就是停一下。然后让同优先级的线程工作一下。

你可能感兴趣的:(Thread各方法适用情况)