关闭

JAVA并发-线程状态和线程组

246人阅读 评论(0) 收藏 举报
分类:
在Java中,线程有6种基本状态,理解这6种基本状态之间的关系可以让我们对多线程有更好的理解.如下图所示:


在Java中,所有的线程都存在于线程组中,每个线程组中可以包含多个线程或者线程组.运行下面的程序,从结果中可以看出默认的线程组层次结构.
system是Java中的根线程组.从system开始,有一层层的线程和线程组.类似目录结构.

/**
 * Java线程组的结构,见运行结果
 * @author Administrator
 *
 */
public class Main {
	public static void main(String [] args) {
		Thread.currentThread().getThreadGroup().getParent().list();
		Thread.currentThread().getThreadGroup().list();
	}	
}

下面的程序中实现当一个线程运行结束时,结束其他的线程.这个需求也可以用Executor框架来完成.不过显然用线程组是容易的.
/**
 * 实现当一个线程运行结束时,结束其他的线程
 * @author Administrator
 *
 */
public class Main {
	public static void main(String [] args) throws InterruptedException{
		ThreadGroup threadGroup = new ThreadGroup("Searcher");
		
		
		for(int i=0;i<5;i++){
			new Thread(threadGroup,new Task(),"t"+(i+1)).start();
		}
		
		System.out.println(threadGroup.activeCount());
		threadGroup.list();
		
		Thread.sleep(1000);
		waitFinish(threadGroup);
		
		threadGroup.interrupt();
	}
	
	private static void waitFinish(ThreadGroup threadGroup) {
		while (threadGroup.activeCount()>5) {
		}
		System.out.println("有一个结束了");
	}
}

class Task implements Runnable {
	public void run() {
		for(int i=0;i<Integer.MAX_VALUE/100;i++){
			System.out.print(i+" ");
			if(Thread.currentThread().isInterrupted())
				break;
		}
		System.out.println(Thread.currentThread().getName());
	}
}


在JAVA多线程编程时,通过为一个线程对象或者一个线程类设置UncaughtExceptionHandler可以实现捕获run()方法内的运行时异常.
下面的例子是捕获线程内的运行时异常:

public class Main {
	public static void main(String [] args) {
		
		for(int i=0;i<3;i++){
			final int flag=i;
			MyThread myThread=new MyThread();
			myThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
				@Override
				public void uncaughtException(Thread arg0, Throwable arg1) {
					// TODO Auto-generated method stub
					System.out.println("mythead发生异常!"+flag);
					
				}
			});
			myTHread.start();
		}
	}
}

class MyThread extends Thread{
	public void run(){
		String str=null;
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(str.hashCode());
	}
}


要注意的是,线程组并没有提供太多有用的功能。我们最好把线程组看成是JAVA API的一次不成功的试验,你可以忽略掉他们,就当它们不存在一样。如果你正在设计的一个类需要处理线程的逻辑组,或许就应该使用线程池Executor。——选自《Effective Java中文版》



















  • 大小: 155.9 KB
0
0
查看评论

Java 线程组和线程池区别

线程组: 线程组存在的意义,首要原因是安全。 java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的。 但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全. 线程池: 线程池存在的意义,首要作用是效率。 线程的创建和结束都需要耗...
  • QQ578473688
  • QQ578473688
  • 2017-01-15 14:45
  • 10518

JMeter 线程组的概念

线程组是任务测试计划的起点,所有的逻辑控制器和采样器都必须放在线程组之下。其他的测试元件(如监听器)可以被直接放在测试计划之下, 这些测试元件对所有线程组都生效。线程组就像它的名字所描述的那样,被用来管理执行性能测试所需要的JMeter线程。 用户通过线程组的控制面板可以:  1.设置...
  • erix1991
  • erix1991
  • 2014-02-08 13:07
  • 1189

Java 多线程(七)——线程组与线程池

Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理。对线程组的控管理,即同时控制线程组里面的这一批线程。
  • Zen99T
  • Zen99T
  • 2016-05-02 15:17
  • 8031

JAVA学习笔记(四十一)-多线程与线程组

线程组ThreadGroup/* * 线程组ThreadGroup * * 结论: * 如果在设置线程组优先级之前设置线程优先级,则线程优先级不受线程组优先级限制 * 如果在设置线程组优先级之后设置线程优先级,则线程优先级不能超过线程组优先级 * * 线程的优先级,默认与启动它的父...
  • wangzi11322
  • wangzi11322
  • 2015-03-30 00:24
  • 1824

Jmeter 线程组之一

对于jmeter而言,所有的测试脚本均是以测试计划的形式进行的,而对于每一个测试计划也是由各种元件组合在一起,各元件在脚本计划中均有不同的作用 适当使用元件组合达到测试目的,以下是对各元件的简要介绍: 一. 线程组件     1. 线程组件是模拟多并发行为必须依靠于线程组件,也是...
  • lxgails00
  • lxgails00
  • 2013-11-26 23:36
  • 2338

java并发——线程状态

线程在一定条件下,状态会发生变化。线程一共有以下几种状态: 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除C...
  • xujie3
  • xujie3
  • 2017-07-29 16:34
  • 140

java 如何获取线程和线程组

http://nadeausoftware.com/articles/2008/04/java_tip_how_list_and_find_threads_and_thread_groups
  • adermxl
  • adermxl
  • 2015-03-10 16:34
  • 350

java问题:什么是线程组

在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。简单地说,线程组就是由线程组成的管理线程的类,这个类是java.lang.ThreadGroup类。 定义一个线程组,通过以下代码可以实现。 ...
  • scyatcs
  • scyatcs
  • 2015-11-22 17:36
  • 868

JAVA线程之四:线程状态检查,后台线程及线程组

一,线程状态的检查      一般情况下无法确定一个线程的运行状态,对于这些处于未知状态的线程,可以通过isAlive()方法用来确定一个线程是否仍处在活动状态。当然即使处于活动状态的线程也并不意味着这个线程一定正在运行,对于一个已开始运行但还没有完...
  • zhandoushi1982
  • zhandoushi1982
  • 2010-04-20 14:49
  • 11317

JMeter压力测试(三)-多线程组并发测试(多场景混合并发)

使用JMeter实现多场景混合并发测试
  • laofashi2015
  • laofashi2015
  • 2017-11-16 17:07
  • 1230
    个人资料
    • 访问:152109次
    • 积分:1788
    • 等级:
    • 排名:千里之外
    • 原创:138篇
    • 转载:11篇
    • 译文:0篇
    • 评论:39条
    最新评论