如何终止用implements Runnable方式实现的线程

时间:2022-12-02 17:31:32
大家好:
       在网上看到,终止一个线程最正确的方式是使用interrupted(),类似于:
       

public void run() {
    while(!isInterrupted()) {
          try {
               // doSomething
          } catch (InterrupedException e) {
               break;
          }
       } 
}  
       


但是isInterrupted()函数在Thread类中才有,也就是说只有继承自Thread类,才能用这种方式实现终止线程。
如果是用实现Runable接口实现的线程,要怎样正确的终止?

8 个解决方案

#1


创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }
 
    public void run() {
         // compute primes larger than minPrime
            . . .
    }
}

然后,下列代码会创建并启动一个线程: 

PrimeRun p = new PrimeRun(143);
new Thread(p).start();
  
 每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。 

楼主你应该好好看看Java API关于线程的介绍。

#2


一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。

#3


引用 1 楼 WonderosSky 的回复:
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }
 
    public void run() {
         // compute primes larger than minPrime
            . . .
    }
}

然后,下列代码会创建并启动一个线程: 

PrimeRun p = new PrimeRun(143);
new Thread(p).start();
  
 每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。 

楼主你应该好好看看Java API关于线程的介绍。


你没有看清问题,我知道怎样起一个线程,我问的是如何正确终止一个线程。。。

#4


引用 2 楼 claram 的回复:
一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。


但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。

#5


引用 4 楼 Linux2_SCDN 的回复:
Quote: 引用 2 楼 claram 的回复:

一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。


但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。



isInterrupted()函数执行的原理也是一样的,先把线程标记为isInterrupted=true,然后等到下次循环的时候退出

#6


引用 5 楼 claram 的回复:
isInterrupted()函数执行的原理也是一样的,先把线程标记为isInterrupted=true,然后等到下次循环的时候退出

确实如此,所以,网上的这种说法是不正确的!
我试验总结了一下终止一个线程的方法,供参考^ ^
http://blog.csdn.net/linux2_scdn/article/details/48052153

#7


实现Runnable其实不是线程,线程是Thread。Runnable只是线程运行时执行的方法对象

#8


public void run() {
    while(! Thread.currnetThread().isInterrupeted()) {
          try {
               // doSomething
          } catch (InterrupedException e) {
               break;
          }
       } 
}  

--->楼主试试这样呢

#1


创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }
 
    public void run() {
         // compute primes larger than minPrime
            . . .
    }
}

然后,下列代码会创建并启动一个线程: 

PrimeRun p = new PrimeRun(143);
new Thread(p).start();
  
 每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。 

楼主你应该好好看看Java API关于线程的介绍。

#2


一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。

#3


引用 1 楼 WonderosSky 的回复:
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }
 
    public void run() {
         // compute primes larger than minPrime
            . . .
    }
}

然后,下列代码会创建并启动一个线程: 

PrimeRun p = new PrimeRun(143);
new Thread(p).start();
  
 每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。 

楼主你应该好好看看Java API关于线程的介绍。


你没有看清问题,我知道怎样起一个线程,我问的是如何正确终止一个线程。。。

#4


引用 2 楼 claram 的回复:
一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。


但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。

#5


引用 4 楼 Linux2_SCDN 的回复:
Quote: 引用 2 楼 claram 的回复:

一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。


但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。



isInterrupted()函数执行的原理也是一样的,先把线程标记为isInterrupted=true,然后等到下次循环的时候退出

#6


引用 5 楼 claram 的回复:
isInterrupted()函数执行的原理也是一样的,先把线程标记为isInterrupted=true,然后等到下次循环的时候退出

确实如此,所以,网上的这种说法是不正确的!
我试验总结了一下终止一个线程的方法,供参考^ ^
http://blog.csdn.net/linux2_scdn/article/details/48052153

#7


实现Runnable其实不是线程,线程是Thread。Runnable只是线程运行时执行的方法对象

#8


public void run() {
    while(! Thread.currnetThread().isInterrupeted()) {
          try {
               // doSomething
          } catch (InterrupedException e) {
               break;
          }
       } 
}  

--->楼主试试这样呢