/**
* 最近在学习线程组方面的东西,运行了《thinking in java》的一个示例程序,程序如下:
*
* @author zhaoke
*
*/
public class TestAccess {
public static void main(String[] args) {
ThreadGroup x = new ThreadGroup("X");// 生成一个单链关系的三个线程群组
ThreadGroup y = new ThreadGroup(x, "Y");
ThreadGroup z = new ThreadGroup(y, "Z");
new TestThread1(x, "one");// 让线程one属于最上层组群
new TestThread2(z, "two");// 让线程two属于最下层组群
}
}class TestThread1 extends Thread {
private int i; public TestThread1(ThreadGroup g, String name) {
super(g, name);
} protected void f() {// 修改自身的属性
i++;
System.out.println(getName() + " f()");
}
}class TestThread2 extends TestThread1 {
public TestThread2(ThreadGroup g, String name) {
super(g, name);
start();
} public void run() {
ThreadGroup threadGroup = getThreadGroup().getParent().getParent();// 得到其所在线程组群数的最上层的组群
threadGroup.list();// 打印出这个组群的详细信息
Thread[] gAll = new Thread[threadGroup.activeCount()];
threadGroup.enumerate(gAll);// 得到这个组群及其所有子群的所有active线程的reference
for (int i = 0; i < gAll.length; i++) {
gAll[i].setPriority(Thread.MIN_PRIORITY);
((TestThread1) gAll[i]).f();
}
threadGroup.list();
}
} // /:~/*******************************************************************************
* 我运行了这个程序,但是并没有书上预料的结果:抛出了空指针异常。运行结果如下:
*
* java.lang.ThreadGroup[name=X,maxpri=10]
Thread[one,5,X]
java.lang.ThreadGroup[name=Y,maxpri=10]
java.lang.ThreadGroup[name=Z,maxpri=10]
Thread[two,5,Z]
two f()
java.lang.NullPointerException
at com.zhaoke.j2seprograme.tijcode.c14.TestThread2.run(TestAccess.java:44)
*
* 我想应该是Thread[] gAll里面有null了。
* 打印结果是gAll中只有一个线程对象。我看了jdk帮助文档,enumerate()有关功能说明如下:Copies into the
* specified array every active thread in this thread group and its subgroups.
* 按照文挡的说明 该函数应该能够把线程one复制到数组gAll中。请能者指教
*
*
*
*/
* 最近在学习线程组方面的东西,运行了《thinking in java》的一个示例程序,程序如下:
*
* @author zhaoke
*
*/
public class TestAccess {
public static void main(String[] args) {
ThreadGroup x = new ThreadGroup("X");// 生成一个单链关系的三个线程群组
ThreadGroup y = new ThreadGroup(x, "Y");
ThreadGroup z = new ThreadGroup(y, "Z");
new TestThread1(x, "one");// 让线程one属于最上层组群
new TestThread2(z, "two");// 让线程two属于最下层组群
}
}class TestThread1 extends Thread {
private int i; public TestThread1(ThreadGroup g, String name) {
super(g, name);
} protected void f() {// 修改自身的属性
i++;
System.out.println(getName() + " f()");
}
}class TestThread2 extends TestThread1 {
public TestThread2(ThreadGroup g, String name) {
super(g, name);
start();
} public void run() {
ThreadGroup threadGroup = getThreadGroup().getParent().getParent();// 得到其所在线程组群数的最上层的组群
threadGroup.list();// 打印出这个组群的详细信息
Thread[] gAll = new Thread[threadGroup.activeCount()];
threadGroup.enumerate(gAll);// 得到这个组群及其所有子群的所有active线程的reference
for (int i = 0; i < gAll.length; i++) {
gAll[i].setPriority(Thread.MIN_PRIORITY);
((TestThread1) gAll[i]).f();
}
threadGroup.list();
}
} // /:~/*******************************************************************************
* 我运行了这个程序,但是并没有书上预料的结果:抛出了空指针异常。运行结果如下:
*
* java.lang.ThreadGroup[name=X,maxpri=10]
Thread[one,5,X]
java.lang.ThreadGroup[name=Y,maxpri=10]
java.lang.ThreadGroup[name=Z,maxpri=10]
Thread[two,5,Z]
two f()
java.lang.NullPointerException
at com.zhaoke.j2seprograme.tijcode.c14.TestThread2.run(TestAccess.java:44)
*
* 我想应该是Thread[] gAll里面有null了。
* 打印结果是gAll中只有一个线程对象。我看了jdk帮助文档,enumerate()有关功能说明如下:Copies into the
* specified array every active thread in this thread group and its subgroups.
* 按照文挡的说明 该函数应该能够把线程one复制到数组gAll中。请能者指教
*
*
*
*/
解决方案 »
- javase的开发环境
- String文字内容重整
- java编程实现tiff图片转换成jpg格式
- JFileChooser
- 请教关于SQLCONNECTION的关闭
- JFreeChart绘图问题
- 本人新建一类,类内有一内部类,若在类内用new新建这内部类的对象,则出错,若将此内部类移出到类外,则new新建时无问题,为什么?
- 关于异常处理请各位大哥多多帮助 小弟头昏脑胀中!!!惨
- jboss-3.0.1_tomcat-4.0.4的默认WEB目录在哪儿?
- tomcat 运行一段时间后几乎耗尽系统资源
- 我写了一个可以把非参数SQL语句转化为参数SQL语句的代码,希望大家帮我测试一下他的健壮性
- org.apache.commons.net.ftp包如何支持ssl?
public static void main(String[] args)
{
ThreadGroup x = new ThreadGroup("X");// 生成一个单链关系的三个线程群组
ThreadGroup y = new ThreadGroup(x, "Y");
ThreadGroup z = new ThreadGroup(y, "Z");
new TestThread2(z, "two");// 让线程two属于最下层组群
new TestThread1(x, "one");// 让线程one属于最上层组群
}
}class TestThread1 extends Thread {
private int i;
public static boolean flag = true; public TestThread1(ThreadGroup g, String name)
{
super(g, name);
start();
} protected void f()
{ // 修改自身的属性
i++;
System.out.println(getName() + " f()");
}
public void run()
{
while(TestThread1.flag)
{
for (long i = 0 ; i < 100000; i ++ );
}
}
}class TestThread2 extends TestThread1
{
public TestThread2(ThreadGroup g, String name)
{
super(g, name);
//start();
} public void run()
{
ThreadGroup threadGroup = getThreadGroup().getParent().getParent();// 得到其所在线程组群数的最上层的组群
threadGroup.list(); // 打印出这个组群的详细信息
Thread[] gAll = new Thread[threadGroup.activeCount()];
threadGroup.enumerate(gAll); // 得到这个组群及其所有子群的所有active线程的reference
for (int i = 0; i < gAll.length; i++)
{
gAll[i].setPriority(Thread.MIN_PRIORITY);
((TestThread1) gAll[i]).f();
}
threadGroup.list();
TestThread1.flag = false;
}
}
java.lang.ThreadGroup[name=Y,maxpri=10]
java.lang.ThreadGroup[name=Z,maxpri=10]
Thread[two,5,Z]
two f()
java.lang.ThreadGroup[name=X,maxpri=10]
java.lang.ThreadGroup[name=Y,maxpri=10]
java.lang.ThreadGroup[name=Z,maxpri=10]
Thread[two,1,Z]
我机器上运行的结果
还是不太明白你的意思。new TestThread1(x, "one"); 为什么会被释放呢?是因为它的run什么也没做吗?可是它的start函数就没有被调用啊!
还有一个问题是sun对ThreadGroup是这样说明的:A thread is allowed to access information about its own thread group, but not to access information about its thread group's parent thread group or any other thread groups.那么线程two为什么能改变其上层ThreadGroup中的线程one的属性呢?