多线程复习笔记之四【多线程中的异常】

在一个线程组中如果其中一个线程执行报错并不影响其他线程的继续执行,例如:

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)方法不会执行。

猜你喜欢

转载自blog.csdn.net/fuyuwei2015/article/details/85042635