在网上看到,终止一个线程最正确的方式是使用interrupted(),类似于:
public void run() {
while(!isInterrupted()) {
try {
// doSomething
} catch (InterrupedException e) {
break;
}
}
}
但是isInterrupted()函数在Thread类中才有,也就是说只有继承自Thread类,才能用这种方式实现终止线程。
如果是用实现Runable接口实现的线程,要怎样正确的终止?
8 个解决方案
#1
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
然后,下列代码会创建并启动一个线程:
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
楼主你应该好好看看Java API关于线程的介绍。
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
你没有看清问题,我知道怎样起一个线程,我问的是如何正确终止一个线程。。。
#4
但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。
#5
isInterrupted()函数执行的原理也是一样的,先把线程标记为isInterrupted=true,然后等到下次循环的时候退出
#6
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;
}
}
}
--->楼主试试这样呢
while(! Thread.currnetThread().isInterrupeted()) {
try {
// doSomething
} catch (InterrupedException e) {
break;
}
}
}
--->楼主试试这样呢
#1
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
然后,下列代码会创建并启动一个线程:
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
楼主你应该好好看看Java API关于线程的介绍。
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
创建线程的另一种方法是声明实现 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
一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。
但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。
#5
一般都采用变量作为线程终止的标识,isInterrupted替换为一个产量,通过修改变量值为false,来终止while循环,达到终止线程的目的,原理一样。
但是当循环中有阻塞的时候,这种方法就不能及时终止线程了。只能等打破了阻塞并且执行到下一次循环条件判断时才能停止。
isInterrupted()函数执行的原理也是一样的,先把线程标记为isInterrupted=true,然后等到下次循环的时候退出
#6
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;
}
}
}
--->楼主试试这样呢
while(! Thread.currnetThread().isInterrupeted()) {
try {
// doSomething
} catch (InterrupedException e) {
break;
}
}
}
--->楼主试试这样呢