JAVA多线程(三)-----线程组、线程池和线程相关类
一、线程组和未处理的异常
Thread类提供了如下几个构造器来设置新创建的线程属于哪个线程组:
Thread(ThreadGroup group,Runnable target):以target的run()方法作为线程执行体创建新线程,属于group线程组
Thread(ThreadGroup group,Runnable target,String Name):以target的run()方法作为线程执行体创建新线程,属于group线程组,线程名为name
Thread(ThreadGroup group,String Name):创建新线程,线程名为name,属于group数组
中途不可改变线程所属线程组
ThreadGroup类提供了如下两个简单的构造器来创建实例:
ThreadGroup(String name):以指定的线程组名字来创建新的线程组
ThreadGroup(ThreadGroup parent,String name):以指定的线程组名字,父线程组来创建新的线程组
public class MyThread extends Thread{ //提供指定线程名的构造器 public MyThread(String name) { super(name); } //提供指定线程名、线程组的构造器 public MyThread(ThreadGroup group, String name) { super(group,name); } public void run() { for(int i = 0; i < 20; i++) { System.out.println(getName() + " 线程的i变量" + i); } } public static void main(String[] args) { //获取主线程所在的线程组,这是所有线程默认的线程组 ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); System.out.println("主线程组的名字:" + mainGroup.getName()); System.out.println("主线程组是否是后台线程组" + mainGroup.isDaemon()); new MyThread("主线程的线程").start(); ThreadGroup tg = new ThreadGroup("新线程组"); tg.setDaemon(true); System.out.println("tg线程组是否是后台线程组" + tg.isDaemon()); MyThread tt = new MyThread(tg,"tg组的线程甲"); tt.start(); new MyThread(tg,"tg组的线程乙").start(); } }
ThreadGroup内还定义了一个很有用的方法,用于处理该线程组内的任意线程所抛出的未处理异常
void uncaughtException(Thread t,Throwable e)
如果线程执行过程中抛出了一个未处理异常,JVM在结束线程之前会自动查找是否有对应的Thread.UncaughtExceptionHandler对象,并调用该对象的uncaughtException(Thread t,Throwable e)方法来处理该异常
class MyExHandler implements Thread.UncaughtExceptionHandler{ public void uncaughtException(Thread t,Throwable e) { System.out.println(t + "线程出现了异常“:" + e); } } public class ExHandler { public static void main(String[] args) { Thread.currentThread().setUncaughtExceptionHandler(new MyExHandler()); int a = 5/0; System.out.println("程序正常结束!"); } }
二、线程池
三、线程相关类
浙公网安备 33010602011771号