本文应注重掌握如下知识点:
- 线程组的使用
- 如何切换线程状态
- SimpleDataFormat 类与多线程的解决办法
- 如何处理线程的异常
1.线程的状态
线程对象在不同运行时期有不同的状态,状态信息就处于State枚举类中,如图所示:

线程状态
-
初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
-
运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
-
阻塞(BLOCKED):表示线程阻塞于锁。
-
等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
-
超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
-
终止(TERMINATED):表示该线程已经执行完毕。
调用与线程有关的方法是造成线程状态改变的主要原因,其关系如图所示:(图片来源于网络)

2.线程组
可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程。

下面看下线程组的使用示例:
public class Group implements Runnable { public static void main(String[] args) { Group runnable = new Group(); ThreadGroup threadGroup = new ThreadGroup("我的线程组"); Thread threadA = new Thread(threadGroup,runnable); Thread threadB = new Thread(threadGroup,runnable); threadA.start(); threadB.start(); System.out.println("活动的线程"+threadGroup.activeCount()); System.out.println("线程组的名称"+threadGroup.getName()); } @Override public void run() { while (true){ System.out.println("Thread-Name: "+Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }运行结果:
活动的线程2 线程组的名称我的线程组 Thread-Name: Thread-0 Thread-Name: Thread-1控制台中的信息表明有2个线程在名为“我的线程组”下活动。
上面的线程树结构图中显示,所有的线程与线程组都在系统线程组下,下面演示如何创建具有多级关联关系的线程结构,并获取相关线程信息。
示例代码:
public class
