重点知识点
线程组使用
切换线程状态
SimpleDataFormat类与多线程的解决方法
处理线程的异常
7.1 线程状态
java.lang.Thread.State 线程的状态信息存在于此类中
调用与线程有关方法后,会进入不同的线程状态
验证 NEW RUNNABLE TERMINATED
MyThread myThread =new MyTread();
myThread.getState= Runnable
mythread.start()
myThread.getState= new
myThread.getState= terminated
验证TIMED_WAITING
代表线程执行了Thread.sleep()方法,呈等待状态
验证BLOCKED
某一个线程在等待锁时
验证WAITING
线程执行了Object.wait()方法后所处的状态
public class Lock{
public static final Byte lock=new Byte(“0”);
}
run(){
synchronized(Lock.lock){
Lock.lock.wait();
}
}
7.2 线程组
线程组作用:批量管理线程或线程组对象
线程对象关联线程组:1级关联
1级关联:父对象中有子对象,并不创建子孙对象
ThreadA aRunnable=new ThreadA();
ThreadB bRunnable=new ThreadB();
ThreadGroup group=new ThreadGroup(“冯浩月的线程组”);
Thread athread=new Thread(group,aRunnable);
Thread bthread=new Thread(group,bRunnable);
athread.start();
bthread.start();
group.activeCount(); // 活动的线程数
group.getName(); // 线程组的名称
线程对象关联线程组:多级关联
多级关联:父对象中有子对象,子对象中再创建子对象,出现子孙对象效果
// 系统环境的一个快照
ThreadGroup mainGroup=Thread.currentThread().getThreadGroup();
ThreadGroup group=new ThreadGroup(mainGroup,”A”);
Runnable runnable=new Runnable(){
}
Thread newThread=new Thread(group,runnable);
newThread.start();// 线程启动后,才归到组A中
线程组自动归属特性
自动归到当前线程组中
ThreadGroup group=new ThreadGroup(“新的组”); // 未指定线程组
获取根线程组
Thread.currentThread.getThreadGroup().getParent(); // system为JVM跟线程组
线程组里加线程组
ThreadGroup group=new ThreadGroup(Thread.currentThread.getThreadGroup,”newGroup”);
组内的线程批量停止
this.isInterrupted()
group.interrupt();
递归与非递归取得组内对象
7.3 使线程具有有序性
private Object lock;
private String showChar;
private int showNumPosition;
private int printCount=0; // 统计打印了几个字母
volatile private static int addNumber=1;
Public MyThread(Object lock,String showChar,int showNumPosition){
super();
this.lock=lock;
this.showChar=showChar;
this.showNumPositon=showNumPosition;
}
public void run(){
try{
synchronized(lock){
while(true){
if(addNumber % 3 == showNumPosition){
lock.notifyAll();
addNumber++;
printCount++;
if(printCount==3){
break;
}
}else{
lock.wait();
}
}
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
main(){
Object lock=new Object();
MyThread a=new MyThread(lock,”A”,1);
MyThread b=new MyThread(lock,”B”,2);
MyThread c=new MyThread(lock,”C”,0);
}
7.4 SimpleDateFormat 非线程安全
在多线程环境下,单例的SimpleDateFormate类极易出现日期转换错误的情况
Date dateRef=sdf.parse(dateString);
String newDateString=sdf.format(dateRef).toString();
解决异常方法1
创建多个SimpleDateFormat实例
解决异常方法2
ThreadLocal类使线程绑定指定对象
7.5 线程中出现异常的处理
对多线程中的异常进行捕捉,使用“UncaughtException”类
MyThread t1=new MyThread();
t1.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){}) // 为指定线程对象设置默认的异常处理器
t1.setDefaultUncaughtExceptionHandler() // 对所有线程对象设置异常处理器
7.6 线程组内处理异常
程序运行中,一个线程出现异常,其他线程全部停止
需要重新异常方法
uncaughtException(Thread t,Throwable e){
super(group,name);
this.interrupt();
}
注意,每个线程对象中的run方法不要有异常catch语句,否则异常方法不执行
7.7 线程异常处理的传递