美文网首页
Thread的join笔记

Thread的join笔记

作者: ShihChieh_Ma | 来源:发表于2019-12-24 14:17 被阅读0次

Thread的join笔记

我之前写都是这样写的

 //判断非null
 if (DevObjectTool.isNotEmpty(mReconnectHandlerThread)) {
     //是否在 4.3 版本及以上
    if (DevAppCommonTool.isJellyBeanMR2()) {
        mReconnectHandlerThread.quitSafely();
    } else {
        mReconnectHandlerThread.quit();
    }
    mReconnectHandlerThread = null;
}

然后今天在看google sample camera2的时候发现他是这样的:

private void stopBackgroundThread() {
        mBackgroundThread.quitSafely();
        try {
            mBackgroundThread.join();
            mBackgroundThread = null;
            mBackgroundHandler = null;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

孤陋寡闻了,不知道join是干啥的,所以看了一下源码,也搜了搜别人的说法,在此做个记录.

先点进去看下方法的说明:

    public final void join() throws InterruptedException {
        join(0);
    }

调用了join(0)方法,传0意味着一直等着他死,注意该线程是指的主线程等待子线程的终止.也就是在子线程调用了join()方法后,这一步后面的代码,只有等到子线程结束了才能执行.

public final void join(long millis) throws InterruptedException {
        synchronized(lock) {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            //无线等待直到线程结束
            while (isAlive()) {
                //wait()执行后拥有当前锁的线程会释放该线程锁,并处于等待状态,等待重新获取锁
                //进入无限期Waiting状态的线程是不会被调度的,只能被主动唤醒或者被中断。另外,线程退出时会执行notifyAll()。
                //Object.wait:Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.
                //Thread.join:This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked.
                lock.wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                lock.wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
        }
    }

一般主线程创建启动子线程,如果主线程处理完其他的事务后,需要用到子线程的处理结果呢?也就是主线程需要等待子线程执行完成之后才行,比如上面mBackgroundThread是指在线程结束后才会置为null,这时候才会用join方法.

例子:

public class DemoActivity {

    static class AThread extends Thread {
        AThread() {
            super("AThread");
        }

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println(name + "-start");
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println(name + "的任务:" + i);
                    Thread.sleep(1000);
                }
            } catch (Exception e) {
                System.out.println("Exception-" + name + ":" + e.getMessage());
            }
        }
    }

    public static void main(String[] args) {
        String name = Thread.currentThread().getName();
        System.out.println(name + "-start");
        AThread aThread = new AThread();
        try {
            aThread.start();
            aThread.join();
            for (int i = 0; i < 5; i++) {
                System.out.println(name + "的任务:" + i);
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            System.out.println("Exception from main");
        }
        System.out.println(name + "-end!");
    }
}

打印:

D:\Java\JDK8\bin\java.exe -javaagent:D:\AndroidStudio\lib\idea_rt.jar=13702:D:\AndroidStudio\bin -Dfile.encoding=UTF-8 -classpath D:\AndroidSDK\platforms\android-28\android.jar;D:\AndroidSDK\platforms\android-28\data\res;E:\Project\AndroidProject\BaseSdkVer\app\build\intermediates\javac\debug\classes;E:\Project\AndroidProject\BaseSdkVer\app\build\generated\res\resValues\debug;C:\Users\Anfeir\.gradle\caches\modules-2\files-2.1\com.android.support\collections\28.0.0\c1bcdade4d3cc2836130424a3f3e4182c666a745\collections-28.0.0.jar;C:\Users\Anfeir\.gradle\caches\modules-2\files-2.1\android.arch.lifecycle\common\1.1.1\207a6efae6a3555e326de41f76bdadd9a239cbce\common-1.1.1.jar;C:\Users\Anfeir\.gradle\caches\modules-2\files-2.1\android.arch.core\common\1.1.1\e55b70d1f5620db124b3e85a7f4bdc7bd48d9f95\common-1.1.1.jar;C:\Users\Anfeir\.gradle\caches\modules-2\files-2.1\com.android.support\support-annotations\28.0.0\ed73f5337a002d1fd24339d5fb08c2c9d9ca60d8\support-annotations-28.0.0.jar;E:\Project\AndroidProject\BaseSdkVer\global\libs\gson-2.8.6.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\889b822dd95e9fb8123fe4d1e399c762\appcompat-v7-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\889b822dd95e9fb8123fe4d1e399c762\appcompat-v7-28.0.0\res;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\323a1237758a5bb13db182834df86c33\support-fragment-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\40d11e4f8724a0d5593953463d1da9cb\animated-vector-drawable-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\ae4e3b606cee226ac2d731f5dff83ebe\support-core-ui-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\a742f138edbe5ab77227b0a22dcc4d96\support-core-utils-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\ee3c7db0020dcc1837e0462ef9f4ea1f\support-vector-drawable-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\f7e8701a0a82403f61d714ca2f2d7f9f\loader-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\7c1cca4cc5ec61ccba121727541eb9c1\viewpager-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\d510c259b163d61f9e1fef116be5df17\coordinatorlayout-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\d510c259b163d61f9e1fef116be5df17\coordinatorlayout-28.0.0\res;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\d9f2ee3458676fadde8bc5a475442934\drawerlayout-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\301a36acac11403b0aa1f9f1f05737f4\slidingpanelayout-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\2e61c7175091476edad50a4b36b50eed\customview-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\f5b35536893a93dedf26244d10211951\swiperefreshlayout-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\ff6031cdc649595422e4056ec3f164d7\asynclayoutinflater-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\033660a778ea366d6a767538ab0259e6\support-compat-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\033660a778ea366d6a767538ab0259e6\support-compat-28.0.0\res;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\e8e5aadea8181ad52d416c671d1d6804\versionedparcelable-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\1678c7f81528fc3033276af0f7911e4e\cursoradapter-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\b0f9c2cef28159421477e4e796f3ff50\runtime-1.1.1\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\955ecb9073a503f6302f9c19754e64f4\documentfile-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\d42eccdb7d6e6d81d4031d0be9f1616e\localbroadcastmanager-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\46b489ac97abe7290fc0bcfb61ea2d7b\print-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\8229464c236d9d150e4c8f2f29c35eff\viewmodel-1.1.1\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\16175bf0cc3e5a0d9fe2deaac0203366\livedata-1.1.1\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\3d72693b21efee6dc57fc82fdb92c288\livedata-core-1.1.1\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\2969fe34dc158a158c31d408138dcabe\runtime-1.1.1\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\86ef75c5e9e34f611b55fe943c47f6da\interpolator-28.0.0\jars\classes.jar;E:\Project\AndroidProject\BaseSdkVer\chat\build\intermediates\javac\debug\classes;E:\Project\AndroidProject\BaseSdkVer\chat\build\generated\res\resValues\debug;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\3756268ec812f883b33958220b657543\recyclerview-v7-28.0.0\jars\classes.jar;C:\Users\Anfeir\.gradle\caches\transforms-2\files-2.1\3756268ec812f883b33958220b657543\recyclerview-v7-28.0.0\res;E:\Project\AndroidProject\BaseSdkVer\network\build\intermediates\javac\debug\classes;E:\Project\AndroidProject\BaseSdkVer\network\build\generated\res\resValues\debug;E:\Project\AndroidProject\BaseSdkVer\basicsnet\build\intermediates\javac\debug\classes;E:\Project\AndroidProject\BaseSdkVer\basicsnet\build\generated\res\resValues\debug;E:\Project\AndroidProject\BaseSdkVer\global\build\intermediates\javac\debug\classes;E:\Project\AndroidProject\BaseSdkVer\global\build\generated\res\resValues\debug com.egoo.basesdkver.app.DemoActivity
main-start
AThread-start
AThread的任务:0
AThread的任务:1
AThread的任务:2
AThread的任务:3
AThread的任务:4
main的任务:0
main的任务:1
main的任务:2
main的任务:3
main的任务:4
main-end!

Process finished with exit code 0

相关文章

网友评论

      本文标题:Thread的join笔记

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