比如我先在一个类中启动了一个a线程(每启动一个线程可获取一个id什么的,就叫getPid()),然后调用start方法,然后在run()一直让这个线程无限循环运行,然后我在另外一个类中通过这个getPid()来终止这个线程。怎么实现,说下原理就行!

解决方案 »

  1.   

    设计3个类:
    1 设置状态的类 比如Status,有个私有属性boolean work,并且设置其set get 公共方法。
    2 是线程类,   比如ThreadA, 里面用到Status对象。在run()里设置死循环,(while(true),里面用get方法检测
      work状态,为真就break,退出while 循环,线程结束。
    3 测试类 含main(0方法。用于启动线程,设置work状态。
      

  2.   

        可以在另一个类中定义一个用于终止线程的方法,有一个线程对象参数,在里面调用线程对象的interrupt方法终止线程运行,但是这要求你的这个线程类的run方法里用while(!isinterrupted()){//随便执行}    想要终止线程的时候,调用那个方法,把线程对象传递过去就可以了。
      

  3.   

    线程是不能终止的,如果强行终止将会产生对象不同的现象。具体的可以参见 JDK 1.2 就废弃的 Thread 的 stop 方法。当前 Sun 也是犯了同样的错误,造成了 API 上永久的废弃!线程可以采用中断、死循环加信号标记的方式进行处理。1:信号标记是个 volatile 的布尔类型变量,当这个变量值改变时,死循环条件发生变化,循环结束,线程就完成了,达到停止线程的目的。但有时候,这种方式并不起作用,比如当前线程处于阻塞状态(像 Thread#sleep, BlockingQueue#take 等方法的调用)时,无法到达下一个循环继续判断信号标记,这样的话需要采用第二种方式——中断。2:中断必须发生在线程处于阻塞状态时,或者再简单一点就是会抛出 InterruptedException 异常的方法都可以进行中断。如果可以的话,最好两者结合在一起使用。比如:public void stop() {
       running = false;
       thread.interrupt();  // 这个 thread 是启动的线程对象
    }
      

  4.   

    public class MThread extends Thread{   private volatile boolean flag = true;
       
       public void run(){
         while(flag){
            try{
            //do something
           }catch(InterruptedException ie){
           
           }
         }
       }
       public void stopThread(){
          flag = false;
          interrupt();  
       }