在一个线程组中如果其中一个线程执行报错并不影响其他线程的继续执行,例如:
package com.fyw.thread.lock.exception;
public class MyThread extends Thread {
private String num;
public MyThread(ThreadGroup group,String name,String num) {
super(group,name);
this.num = num;
}
@Override
public void run() {
int numInt = Integer.parseInt(num);
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(\"死循环执行中:\"+Thread.currentThread().getName());
}
}
}
package com.fyw.thread.lock.exception;
public class Run {
public static void main(String[] args) {
ThreadGroup group = new ThreadGroup(\"自定义线程组\");
MyThread[] myThread = new MyThread[10];
for(int i=0;i<myThread.length;i++){
myThread[i] = new MyThread(group,\"线程\"+(i+1),\"1\");
myThread[i].start();
}
MyThread newT = new MyThread(group, \"报错线程\", \"a\");
newT.start();
}
}
【运行结果】
Exception in thread \"报错线程\" java.lang.NumberFormatException: For input string: \"a\"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at com.fyw.thread.lock.exception.MyThread.run(MyThread.java:14)
死循环执行中:线程10
死循环执行中:线程9
死循环执行中:线程4
死循环执行中:线程2
死循环执行中:线程3
死循环执行中:线程6
死循环执行中:线程8
死循环执行中:线程1
死循环执行中:线程5
死循环执行中:线程7
死循环执行中:线程10
......
如果线程组中一个线程异常,其他线程也终止
package com.fyw.thread.lock.exception;
public class MyThreadGroup extends ThreadGroup {
public MyThreadGroup(String name) {
super(name);
}
public void uncaughtException(Thread t, Throwable e) {
super.uncaughtException(t, e);
this.interrupt();
}
}
package com.fyw.thread.lock.exception;
public class MyThread extends Thread {
private String num;
public MyThread(ThreadGroup group, String name, String num) {
super(group, name);
this.num = num;
}
public void run() {
int numInt = Integer.parseInt(num);
while (this.isInterrupted() == false) {
System.out.println(\"死循环中:\" + Thread.currentThread().getName());
}
}
}
package com.fyw.thread.lock.exception;
public class Run {
public static void main(String[] args) {
MyThreadGroup group = new MyThreadGroup(\"我的线程组\");
MyThread[] myThread = new MyThread[10];
for (int i = 0; i < myThread.length; i++) {
myThread[i] = new MyThread(group, \" 线程 \" + (i + 1), \"1\");
myThread[i].start();
}
MyThread newT = new MyThread(group, \"报错线程 \", \"a\");
newT.start();
}
}
运行结果
死循环中: 线程 1
死循环中: 线程 4
死循环中: 线程 3
死循环中: 线程 2
死循环中: 线程 7
死循环中: 线程 3
死循环中: 线程 4
死循环中: 线程 1
死循环中: 线程 1
死循环中: 线程 1
死循环中: 线程 1
死循环中: 线程 1
死循环中: 线程 4
死循环中: 线程 3
死循环中: 线程 6
死循环中: 线程 7
死循环中: 线程 2
死循环中: 线程 5
死循环中: 线程 2
死循环中: 线程 7
Exception in thread \"报错线程 \" java.lang.NumberFormatException: For input string: \"a\"
死循环中: 线程 6
死循环中: 线程 3
死循环中: 线程 4
死循环中: 线程 1
死循环中: 线程 10
死循环中: 线程 9
死循环中: 线程 8
死循环中: 线程 9
死循环中: 线程 10
死循环中: 线程 1
死循环中: 线程 4
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
死循环中: 线程 3
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
死循环中: 线程 6
at com.fyw.thread.lock.exception.MyThread.run(MyThread.java:12)
死循环中: 线程 7
死循环中: 线程 2
死循环中: 线程 6
死循环中: 线程 5
死循环中: 线程 7
死循环中: 线程 3
死循环中: 线程 4
死循环中: 线程 1
死循环中: 线程 10
死循环中: 线程 9
死循环中: 线程 8
但是MyThread类如果这样写
public class MyThread extends Thread {
private String num;
public MyThread(ThreadGroup group, String name, String num) {
super(group, name);
this.num = num;
}
public void run() {
int numInt = Integer.parseInt(num);
while (this.isInterrupted() == false) {
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(\"死循环中:\" + Thread.currentThread().getName());
}
}
}
添加了一个sleep之后其他线程就不会终止了,因为run方法中如果有catch语句,public void uncaughtException(Thread t, Throwable e)方法不会执行。
继续阅读与本文标签相同的文章
下一篇 :
人类将永生不死?疾病、衰老、痛苦彻底消失!
-
Jvm-Sandbox源码分析--启动时加载模块
2026-05-19栏目: 教程
-
免费的分布式事务来了——阿里巴巴Fescar
2026-05-19栏目: 教程
-
升级iOS 13后真能随意换字体?库克言:想多了,字体管理≠换字体
2026-05-19栏目: 教程
-
Java发送邮件必带超时时间配置
2026-05-19栏目: 教程
-
学术研究显示:移动支付让人花钱更多,是真的吗?
2026-05-19栏目: 教程
