????????????long??time??=??System.currentTimeMillis();????
????????????while??(??(System.currentTimeMillis()-time??<??1000)??&&??(!stop)??)??{????
????????????}????

????????}????
??????System.out.println(??"Thread??exiting??under??request..."??);????
????}????
}????
运行Listing B中的代码将产生如下输出(注意线程是如何有秩序的退出的)??
Starting thread...??
Thread is running...??
Thread is running...??
Thread is running...??
Asking thread to stop...??
Thread exiting under request...??
Stopping application...??
???? 虽然该方法要求一些编码,但并不难实现。同时,它给予线程机会进行必要的清理工作,这在任何一个多线程应用程序中都是绝对需要的。请确认将共享变量定义成volatile 类型或将对它的一切访问封入同步的块/方法(synchronized blocks/methods)中。??
到目前为止一切顺利!但是,当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,这里仅举出一些。??
他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。??
很不幸运,不存在这样一种机制对所有的情况都适用,但是,根据情况不同却可以使用特定的技术。在下面的环节,我将解答一下最普遍的例子。??
使用Thread.interrupt()中断线程??
?? 正如Listing A中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。??
?????? 因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。Listing C这个示例描述了该技术。??
Listing C??
class??Example3??extends??Thread??{????
????volatile??boolean??stop??=??false;????
????public??static??void??main(??String??args[]??)??throws??Exception??{????
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-69021-3.html
要是自己不努力
还没朋友
就算有钱也没法去