1.Thread的构造方法
![c16a6c36f7a1974de65841b1058ca578.png](https://i-blog.csdnimg.cn/blog_migrate/0831622767b08fb71b094d7b67b64348.jpeg)
![326cdd510cc6f6ef9db118e3d73744ae.png](https://i-blog.csdnimg.cn/blog_migrate/dba47c11b410a93df390f4b627457dc6.jpeg)
![61fc5d573be417ceb5089d76ff542d3e.png](https://i-blog.csdnimg.cn/blog_migrate/4c3d0b0d8aa78334c9a180f291580e8a.jpeg)
package threadAPI; public class CreateThread { public static void main(String[] args) { Thread t1 = new Thread(); Thread t2 = new Thread(); t1.start(); t2.start(); System.out.println(t1.getName()); System.out.println(t2.getName()); }}
![c084b45b9b2a85551197b32fd79e4ef8.png](https://i-blog.csdnimg.cn/blog_migrate/79ffa78965e9e05392466413bb5f6c1d.jpeg)
总结1:
- 创建线程对象Thread,默认有一个线程名,以Thread-开头,从0开始计数
![797dfd653102baea97a27bb66f8133ad.png](https://i-blog.csdnimg.cn/blog_migrate/a036da9e3185896b8100c6ab821dbbbb.jpeg)
- Thread-0
- Thread-1
- Thread-2
可以看到Thread()中默认传入的第二个参数,即Runnable接口为null
在init方法中
![9f06ee91ab5d2d385b9ee93d7ec2bbc1.png](https://i-blog.csdnimg.cn/blog_migrate/3bba972d24927b70468d07bb69912ce5.jpeg)
会将我们传入的target给Thread的成员变量
![62595398774260b3a8b02f37be5bfbcb.png](https://i-blog.csdnimg.cn/blog_migrate/9a2648b9e56910fc23650ff0768e60dc.jpeg)
然后在调用run方法的时候,会做如下判断
![e72f9e60ce9a3352981dcde638c32537.png](https://i-blog.csdnimg.cn/blog_migrate/72ccfaad114721bf6895608efd9efdf0.jpeg)
所以当target为null的时候,默认的run方法中什么也不做
总结2:
- 如果在构造Thread的时候,没有传递Runnable接口或者没有复写Thread的run方法,该Thread将不会调用任何东西
- 如果传递了Runnable接口的实例,则会执行该方法的逻辑代码
![0a59a395e0e3a174077b45539c0bb4bf.png](https://i-blog.csdnimg.cn/blog_migrate/c89671e2197aa3f9f815a3faf24eaa10.jpeg)
- 如果复写了Thread的run方法,则会执行复写的逻辑代码
![759db302e5c92d7c99b846ee7436de44.png](https://i-blog.csdnimg.cn/blog_migrate/a2ebc7e86969b6a2f2925ded979499b4.jpeg)
为线程传递一个线程名
![49a159f5ad170fe9b162058d45827fe5.png](https://i-blog.csdnimg.cn/blog_migrate/bc877bc5122ae354d185b39ba56ca483.jpeg)
![b84f4942127cd91725ea08b500890e58.png](https://i-blog.csdnimg.cn/blog_migrate/0a2561efc92fb68d3383259beac99caf.jpeg)
这时我们传入的参数名,会传递给线程对象的成员变量name
![f6eef26b96a481c58c74522007f48d63.png](https://i-blog.csdnimg.cn/blog_migrate/a4777eca8407030a868e81c7794bef1c.jpeg)
为线程传递线程名的同时,传递Runnbale接口的实现类对象,调用原理同上
![a51dc12f2ef7e262bff8c193b5d62967.png](https://i-blog.csdnimg.cn/blog_migrate/712bfaf321e49a9ebc7045136c478b11.jpeg)
![c670cb981ac1a783a62c6de73adad0f2.png](https://i-blog.csdnimg.cn/blog_migrate/160b3502ba5f0c118d04909b6fab60ff.jpeg)
我们还可以在为线程传入线程组
其实在上述的方法中没有传入线程组的情况下,init方法的ThreadGroup默认被传入null
![10dcf9dfb91d12b527c71855f4a6fd9b.png](https://i-blog.csdnimg.cn/blog_migrate/283e8b4eaa0702513141813c1d86dd6d.jpeg)
![fa1c7dbe584dbe53430201a48ad3392d.png](https://i-blog.csdnimg.cn/blog_migrate/6775de1bcb086e0e45a1b22f41ca2033.jpeg)
![b4b295e4605804b8aeb8b594fe200f6b.png](https://i-blog.csdnimg.cn/blog_migrate/ba0dcad4fc42b682d683b7ed5f4357be.jpeg)
parent即调用Thread对象的start方法的线程
package threadAPI; public class CreateThread { public static void main(String[] args) { Thread t = new Thread(); t.start(); System.out.println(t.getThreadGroup()); System.out.println(Thread.currentThread().getName()); System.out.println(Thread.currentThread().getThreadGroup()); }}
![3f3d4e353225b524151502d3a93eadf1.png](https://i-blog.csdnimg.cn/blog_migrate/38cb4e88c3b7c7feb96c9b2f102755ac.jpeg)
总结:
- 如果构造线程对象时未传入ThreadGroup,Thread默认会获取父线程的ThreadGroup作为该线程的ThreadGroup,此时子线程和父线程在同一个ThreadGroup中
我们可以查看当前ThreadGroup中有多少个线程在运行
package threadAPI; public class CreateThread { public static void main(String[] args) { Thread t = new Thread(); t.start(); ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); System.out.println(threadGroup.activeCount()); //创建一个Thread数组 Thread[] threads = new Thread[threadGroup.activeCount()]; //将threadGroup中的数组枚举到threads数组中 threadGroup.enumerate(threads); //打印threads接收到的线程 for (Thread thread : threads) { System.out.println(thread); } }}
![3a2854712fd59abb2b5810831520d15e.png](https://i-blog.csdnimg.cn/blog_migrate/b4af6bfa45329c264285d45496a8bba5.jpeg)
线程组的详细介绍见后续博文:
stackSize:
![0a95e15bffe8e09443ae0eed1009e01f.png](https://i-blog.csdnimg.cn/blog_migrate/cbddd002b2a8e47cd1f62bff8779d72a.jpeg)
![51a0013fcec460848235de9b8e6cf58f.png](https://i-blog.csdnimg.cn/blog_migrate/1d3ddeacc3ce50d11ee5b6f78793cde7.jpeg)
演示代码:
public class CreateThreadDemo { private static int counter; public static void main(String[] args) { Thread t1 = new Thread(null, new Runnable() { @Override public void run() { try { add(1); }catch (Error e){ System.out.println(counter); e.printStackTrace(); } } private void add(int i){ counter++; add(i+1); } },