本来我是想如果执行时间超过了多久,用线程组的destroy 结束不了。执行threadGroup1.destroy();
报错,Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.ThreadGroup.destroy(ThreadGroup.java:750)
怎么才能结束线程组。while (true) {
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} // 如果 时间超过30分钟自动停止
if ((System.currentTimeMillis() - beginTime) >= ConstantUtil.DURATIONTIME) {
if (threadGroup1.activeCount() > 0) {
threadGroup1.destroy();
}
break;
}
if (threadGroup1.activeCount() == 0) {
endTime = System.currentTimeMillis();
break;
} }

解决方案 »

  1.   

    1)ThreadGroup.destroy(),适用于销毁此线程组及其所有子组的,此线程组必须为空;如果线程组不为空,或者线程组已经被销毁就报IllegalThreadStateException;
    2)可用ThreadGroup.interrupt()中断线程组中的所有线程,相当于对线程组中所有线程调用interrupt方法;
      

  2.   

    houjin_cn
    没有用ThreadGroup.interrupt(),这个我早就用过了,java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.mstar.meds.test.TestThread.run(TestThread.java:28)
    at java.lang.Thread.run(Thread.java:595)
      

  3.   

    Thread thread1 = new Thread(threadGroup1, new TestThread());
    TestThread我写了一个while true在那一直跑,本来想通过threadGroup1 来结束时有的线程
    public void run() {
    while (true) {
    try {
    Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("sssstest===");
    } }
      

  4.   

    线程组我没用过不发表意见
    而你所说的线程中interrupt方法来中断线程,那是错误的,他只是将阻塞的线程打断,抛一个异常而已,并不能够中断线程所谓中断线程的方法,最好的一种方式就是让线程执行完成,线程自然会中断
      

  5.   

    1)用ThreadGroup.interrupt(), 被结束线程抛出异常,这很正常;
    2)ThreadGroup.destroy(),是直接在这里抛异常,没有正确执行了;
    3)catch到InterruptedException异常,你就必需跳出循环,让线程自然终止,因为InterruptedException异常就表示本线程的interrupt方法本调用了,有人希望这个线程终止;
      

  6.   

    正常的被动中断线程的方式就是 检测到InterruptedException 或interrupted()方法返回true时退出循环
      

  7.   

    谁规定入到异常就要退出线程了,如果你经历实际的项目你就会知道其实异常的容错处理很重要
    而不是单单的抛出,其实线程很多情况下用interrupt方法来唤醒线程,而不是关闭线程
    不过你说的也不错,抛出异常也能够达到线程关闭的作用
      

  8.   

    还有个办法就是调用  System.exit(1); 直接 退出者个main 函数
      

  9.   

    使用Timer另起一个任务,来对线程的监控,判段在20过后如果线程未执行完成,就使用Timer关闭线程关闭的方法上面讨论过不过建议你在执行线程的时候别while(true)而是用一个变量控制
    改变变量值为false就线程关闭
      

  10.   

    建议看一下callable,future和excutor