2024年3月9日发(作者:)
程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难题,
如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。
在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。
背景中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在
进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继
续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,你
必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。
首先,忘掉方法。虽然它确实停止了一个正在运行的线程,然
而,这种方法是不
安全
也是不受提倡的,这意味着,在未来的JAVA版本中,它将
不复存在。
一些轻率的家伙可能被另一种方法upt所迷惑。尽管,其名
称似乎在暗示着什么,然而,这种方法并不会中断一个正在运行的线程(待会将
进一步说明),正如Listing A中描述的那样。它创建了一个线程,并且试图使
用upt方法停止该线程。 ()方法的调用,为线程
的初始化和中止提供了充裕的时间。线程本身并不参与任何有用的操作。
class Example1 extends Thread {
boolean stop=false;
public static void main( String args[] ) throws Exception
{
Example1 thread = new Example1();
n( "" );
();
( 3000 );
n( "" );
upt();
( 3000 );
n("" );
//(0);
}
public void run() {
while(!stop){
n( "Thread " );
long time = tTimeMillis();
while((tTimeMillis()-time < 1000)) {
}
}
n("Thread exiting " );
}
}
如果你运行了Listing A中的代码,你将在控制台看到以下输出:
Thread
Thread
Thread
Thread
Thread
Thread
Thread
Thread
Thread
...............................
甚至,在upt()被调用后,线程仍然继续运行。
真正地中断一个线程
中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)
发出信号,告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量
(尤其在冗余操作期间),然后有秩序地中止任务。Listing B描述了这一方式。
Listing B
class Example2 extends Thread {
volatile boolean stop = false;
public static void main( String args[] ) throws Exception {
Example2 thread = new Example2();
n( "" );
();
( 3000 );
n( "Asking thread " );
= true;
( 3000 );
n( "" );
//( 0 );
}
public void run() {
while ( !stop ) {
n( "Thread " );
long time = tTimeMillis();
while ( (tTimeMillis()-time < 1000) && (!stop) ) {
}


发布评论