美文网首页
Thread各方法适用情况

Thread各方法适用情况

作者: WoongTalk | 来源:发表于2018-10-18 18:04 被阅读0次

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各方法适用情况

    sleep() sleep()方法会使线程睡眠,交出CPU给其他线程使用。 注意:sleep()方法不会释放锁。 ...

  • 获取当前类名

    适用于非静态方法:this.getClass().getName()适用于静态方法:Thread.currentT...

  • Worker Thread模式

    别名 Thread Pool Background Thread 适用的情况 为了提高响应性, 而经常开启新线程让...

  • 同步代码分析(互斥)

    互斥问题描述: thread1和thread2都调用了output方法,理想的情况下,当thread1调用outp...

  • Guarded Suspension 模式

    适用的情况 相比于Single Thread Exception模式, 本模式加入了加入了守护条件来确保共享实例在...

  • iOS 处理tableView下拉时顶部出现的空白

    方法一:判断offset设置tableView的背景颜色(适用只有一个section的情况|适用顶部为纯颜色的情况...

  • Immutable模式

    适用的情况 多个线程之间共享对象, 但是该对象的状态不会发生变化用于提高Single Thread Excepti...

  • Java中实现多线程的方式

    [TOC] 一、继承Thread类 继承Thread类,重写run方法,调用Thread的start()方法启动线...

  • 线程中断的简单理解

    静态方法 Thread.interrupted()实例方法 Thread.currentThread().isIn...

  • 线程协程WWW

    线程:Thread // 新线程-1 调用静态方法 Thread m_Thread_1 = new Thread(...

网友评论

      本文标题:Thread各方法适用情况

      本文链接:https://www.haomeiwen.com/subject/ropszftx.html