线程组多次调用_Java多线程——ThreadAPI详细介绍

1.Thread的构造方法

c16a6c36f7a1974de65841b1058ca578.png
326cdd510cc6f6ef9db118e3d73744ae.png
61fc5d573be417ceb5089d76ff542d3e.png
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

总结1:

  • 创建线程对象Thread,默认有一个线程名,以Thread-开头,从0开始计数
797dfd653102baea97a27bb66f8133ad.png
  • Thread-0
  • Thread-1
  • Thread-2

可以看到Thread()中默认传入的第二个参数,即Runnable接口为null

在init方法中

9f06ee91ab5d2d385b9ee93d7ec2bbc1.png

会将我们传入的target给Thread的成员变量

62595398774260b3a8b02f37be5bfbcb.png

然后在调用run方法的时候,会做如下判断

e72f9e60ce9a3352981dcde638c32537.png

所以当target为null的时候,默认的run方法中什么也不做

总结2:

  • 如果在构造Thread的时候,没有传递Runnable接口或者没有复写Thread的run方法,该Thread将不会调用任何东西
  • 如果传递了Runnable接口的实例,则会执行该方法的逻辑代码
0a59a395e0e3a174077b45539c0bb4bf.png
  • 如果复写了Thread的run方法,则会执行复写的逻辑代码
759db302e5c92d7c99b846ee7436de44.png

为线程传递一个线程名

49a159f5ad170fe9b162058d45827fe5.png
b84f4942127cd91725ea08b500890e58.png

这时我们传入的参数名,会传递给线程对象的成员变量name

f6eef26b96a481c58c74522007f48d63.png

为线程传递线程名的同时,传递Runnbale接口的实现类对象,调用原理同上

a51dc12f2ef7e262bff8c193b5d62967.png
c670cb981ac1a783a62c6de73adad0f2.png

我们还可以在为线程传入线程组

其实在上述的方法中没有传入线程组的情况下,init方法的ThreadGroup默认被传入null

10dcf9dfb91d12b527c71855f4a6fd9b.png
fa1c7dbe584dbe53430201a48ad3392d.png
b4b295e4605804b8aeb8b594fe200f6b.png

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

总结:

  • 如果构造线程对象时未传入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

线程组的详细介绍见后续博文:

stackSize:

0a95e15bffe8e09443ae0eed1009e01f.png
51a0013fcec460848235de9b8e6cf58f.png

演示代码:

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); }  },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值