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) ) {

}