1.new Thread的线程默认所属线程组是什么?
先来个demo
class ThreadActivity :Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_thread)
testThreadGroup()
}
private fun testThreadGroup() {
Log.e("testThreadGroup0",Thread.currentThread().toString())
Thread(){
Log.e("testThreadGroup1",Thread.currentThread().toString())
}.start()
Thread(ThreadGroup("groupzero")) {
Log.e("testThreadGroup2",Thread.currentThread().toString())
}.start()
Thread(null){
Log.e("testThreadGroup3",Thread.currentThread().toString())
}.start()
}
}
当ThreadActivity页面启动后,我们可以观察到logcat中打印信息如下
2021-09-08 13:58:04.833 26090-26090/com.example.myapplication E/testThreadGroup0: Thread[main,5,main]
2021-09-08 13:58:04.834 26090-26137/com.example.myapplication E/testThreadGroup1: Thread[Thread-3,5,main]
2021-09-08 13:58:04.834 26090-26138/com.example.myapplication E/testThreadGroup2: Thread[Thread-4,5,groupzero]
2021-09-08 13:58:04.834 26090-26139/com.example.myapplication E/testThreadGroup3: Thread[Thread-5,5,main]
Thread的toString方法源码如下:
public String toString() {
ThreadGroup group = getThreadGroup();
if (group != null) {
return "Thread[" + getName() + "," + getPriority() + "," +
group.getName() + "]";
} else {
return "Thread[" + getName() + "," + getPriority() + "," +
"" + "]";
}
}
我们来分析下logcat:
testThreadGroup0是在主线程打印的,其线程名称是main,优先级为5,线程组名称为main.
testThreadGroup1是我们通过new Thread()创建的一个子线程,其线程名称为Thread-3,优先级为5,线程组名称为main.
testThreadGroup2我们通过new Thread(ThreadGroup,Runnable)的形式创建,其中ThreadGroup给线程组设置了一个名称为groupzero,其线程名称为Thread-4,优先级为5,线程组名称为groupzero。
testThreadGroup3同testThreadGroup2类似,也是使用new Thread(ThreadGroup,Runnable)的形式创建,只不过这一次我们传入的ThreadGroup为null.打印出来的logcat显示,其线程名称为Thread-5,优先级为5,线程组名称为main.
当我们查看源码的时候发现,其实testThreadGroup1内部调用的就是testThreadGroup3的方式,而在线程初始化的时候,如果ThreadGroup为null,则会将 currentThread().getThreadGroup()(即当前线程的线程组)赋值给新创建线程。
我们可以得出结论,创建线程的时候如果不指定线程组(包括不指定和传入null),那所创建线程默认是属于main线程组的,否则他是属于我们所指定的线程组。