线程的状态:
new:至今尚未启动的线程处于这种状态
Runnable:正在java虚拟机中执行的线程处于这种状态
block:受阻塞并等待某个监视器锁的线程处于这种状态
waiting:无限期的等待另一个线程来执行某一个特定操作的线程处于这种状态,就是执行了Object.wait()方法后,线程所处的状态
Timed_waiting:等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态,执行了sleep()方法后,线程的状态枚举值就是TIMED_WAITING
Timeminated:已经退出的线程
ps:
public MyThread() {
System.out.println("构造方法中的状态:"+Thread.currentThread().getState());
}
@Override
public void run() {
System.out.println("run方法中的状态:"+Thread.currentThread().getState());
}
MyThread t = new MyThread();
System.out.println("main方法中的状态1:"+t.getState());
Thread.sleep(1000);
t.start();
Thread.sleep(1000);
System.out.println("main方法中的状态2:"+t.getState());
打印的结果:
、 构造方法中的状态:RUNNABLE、、是的主线程的状态
main方法中的状态1:NEW
run方法中的状态:RUNNABLE
main方法中的状态2:TERMINATED
线程组:类似于树的形式,ThreadGroup,
ThreadA aThread = new ThreadA();
ThreadB bThread = new ThreadB();
ThreadGroup tg = new ThreadGroup("大皇子");
Thread ta = new Thread(tg, aThread);
Thread tb = new Thread(tg, bThread);
ta.start();
tb.start();
System.out.println("活动的线程数"+tg.activeCount());
System.out.println("线程组的名字"+tg.getName());
线程组自动归属特性:自动归到当前线程组中;
根线程组获取:Thread.currentThread().getThreadGroup().getParent().getName();在往上继续getParent(),到根线程组再使用getParent就会出现空指针异常了
批量停止线程:调用ThreadGroup的interrupt();将线程组内的所有线程都停止!
递归与递归取得组内对象:Thread.currentThread().getThreadGroup().enumereate(listGroup,true);true代表递归获取组内对象
使线程具有有序性:
synchronized (lock) {
while (true) {
if (addNumber % 3 == showNumPostion) {
System.out.println("ThreadName="+Thread.currentThread().getName()+" runCount="+addNumber+" "+shoChar);
lock.notifyAll();
addNumber++;
printCount++;
if (printCount == 3) {
break;
}
} else {
lock.wait();
}
}
}
启动3个线程顺序打印
ThreadName=Thread-0 runCount=1 A
ThreadName=Thread-1 runCount=2 B
ThreadName=Thread-2 runCount=3 C
ThreadName=Thread-0 runCount=4 A
ThreadName=Thread-1 runCount=5 B
ThreadName=Thread-2 runCount=6 C
ThreadName=Thread-0 runCount=7 A
ThreadName=Thread-1 runCount=8 B
ThreadName=Thread-2 runCount=9 C
SimpleDateFormat非线程安全,在多线程的环境中,容易造成数据转换以及处理不准确
解决:每次解析都创建新的SimpleDateFormat类,ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<SimpleDateFormat>();
ThreadLocal类能使线程绑定到指定的对象,使用该类可以解决多线程环境下SimpleDateFormat类处理错误的情况
线程中出现异常的处理:
thread.setUncaughtExcepitonHandler()对指定的线程对象设置默认的异常处理器,还可以使用setDefaultUncaughtExceptionHandler();
一个线程出现异常,其它线程不会受影响,要想在其中一个出现异常,其它线程都停止
在线程组中 ThreadGroup,重写uncaughtException(Thread t , Throwable e){}的时候,在线程对象中的run()方法内部不能有catch语句;否则uncaught.....方法不执行