Java多线程核心技术(六)线程组与线程异常

 本文应注重掌握如下知识点:

  1. 线程组的使用
  2. 如何切换线程状态
  3. SimpleDataFormat 类与多线程的解决办法
  4. 如何处理线程的异常

1.线程的状态

线程对象在不同运行时期有不同的状态,状态信息就处于State枚举类中,如图所示:

线程状态

  1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。

  2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。

    线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。

  3. 阻塞(BLOCKED):表示线程阻塞于锁。

  4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

  5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。

  6. 终止(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 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信