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
网友评论