重点知识点

线程组使用
切换线程状态
SimpleDataFormat类与多线程的解决方法
处理线程的异常

7.1 线程状态

java.lang.Thread.State 线程的状态信息存在于此类中
调用与线程有关方法后,会进入不同的线程状态
image.png

验证 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 线程异常处理的传递