国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

多線(xiàn)程之退出方式

2019-11-08 01:31:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

筆記整理自 http://blog.csdn.net/jiaby008/article/details/6198739

注:CSDN代碼塊中不能加粗字體,所以語(yǔ)句前后被標(biāo)**的即為加粗字體

首先,忘掉Thread.stop方法,雖然它確實(shí)停止了一個(gè)正在運(yùn)行的線(xiàn)程,然而這種方法是不安全也是不受提倡的 Thread.interrupt并不會(huì)中斷一個(gè)正在運(yùn)行的線(xiàn)程。 (一個(gè)線(xiàn)程調(diào)用interrupt()后只是改變了中斷狀態(tài),它才可以繼續(xù)執(zhí)行下去,在沒(méi)有調(diào)用sleep,wait,join等方法或自己拋出異常之前,它就可以調(diào)用interrupted()來(lái)清除中斷狀態(tài)(變回原狀))

中斷線(xiàn)程:最受推薦的方式是,使用共享變量(shared variable)發(fā)出信號(hào),告訴線(xiàn)程必須停止正在運(yùn)行的任務(wù)。 示例代碼:

class Example2 extends Thread { **volatile boolean stop = false;** public static void main( String args[] ) throws Exception { Example2 thread = new Example2(); System.out.application..." ); } public void run() { **while ( !stop )** { System.out.println( "Thread is running..." ); long time = System.currentTimeMillis(); while ( (System.currentTimeMillis()-time < 1000) && (!stop) ) { } } System.out.println( "Thread exiting under request..." ); }}

但是按上述實(shí)例,那么當(dāng)線(xiàn)程被阻塞時(shí),它便不能核查共享變量,也就不能停止(例如調(diào)用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()時(shí)可能永久的阻塞線(xiàn)程)

使用Thread.interrupt()與共享變量中斷阻塞線(xiàn)程

Thread.interrupt()方法不會(huì)中斷一個(gè)正在運(yùn)行的線(xiàn)程。這一方法實(shí)際上完成的是,在線(xiàn)程受到阻塞時(shí)拋出一個(gè)中斷信號(hào),這樣線(xiàn)程就得以退出阻塞的狀態(tài)。更確切的說(shuō),如果線(xiàn)程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那么,它將接收到一個(gè)中斷異常(InterruptedException),從而提早地終結(jié)被阻塞狀態(tài) 如果線(xiàn)程沒(méi)有被阻塞,這時(shí)調(diào)用interrupt()將不起作用;否則,線(xiàn)程就將得到異常(該線(xiàn)程必須事先預(yù)備好處理此狀況),接著逃離阻塞狀態(tài)。 實(shí)例:

class Example3 extends Thread { **volatile boolean stop = false;** public static void main( String args[] ) throws Exception { Example3 thread = new Example3(); System.out.println( "Starting thread..." ); **thread.start();** Thread.sleep( 3000 ); System.out.println( "Asking thread to stop..." ); **thread.stop = true;//如果線(xiàn)程阻塞,將不會(huì)檢查此變量** **thread.interrupt();** Thread.sleep( 3000 ); System.out.println( "Stopping application..." ); } public void run() { **while ( !stop )** { System.out.println( "Thread running..." ); try {**//這里線(xiàn)程被阻塞,thread.interrupt()發(fā)現(xiàn)被Thread.sleep阻塞,則拋出阻塞異常,而后退出阻塞狀態(tài)** **Thread.sleep( 1000 );** } **catch ( InterruptedException e )** { System.out.println( "Thread interrupted..." ); } } System.out.println( "Thread exiting under request..." ); }}

中斷I/O操作:

I/O操作可以阻塞線(xiàn)程一段相當(dāng)長(zhǎng)的時(shí)間,特別是牽扯到網(wǎng)絡(luò)應(yīng)用時(shí)。例如,服務(wù)器可能需要等待一個(gè)請(qǐng)求(request),又或者,一個(gè)網(wǎng)絡(luò)應(yīng)用程序可能要等待遠(yuǎn)端主機(jī)的響應(yīng)。 如果你正使用通道(channels)(NIO),那么被阻塞的線(xiàn)程將收到一個(gè)ClosedByInterruptException異常。如果情況是這樣,其代碼的邏輯和上述實(shí)例中的是一樣的,只是異常不同而已。 但如果是傳統(tǒng)IO,Thread.interrupt()將不起作用,因此線(xiàn)程將不會(huì)退出被阻塞狀態(tài)。 java為這種情形提供了一項(xiàng)解決方案,即調(diào)用阻塞該線(xiàn)程的套接字(Socket)的close()方法。在這種情形下,如果線(xiàn)程被I/O操作阻塞,該線(xiàn)程將接收到一個(gè)SocketException異常,這與使用interrupt()方法引起一個(gè)InterruptedException異常被拋出非常相似 唯一要說(shuō)明的是,必須存在socket的引用(reference),只有這樣close()方法才能被調(diào)用。這意味著socket對(duì)象必須被共享。 實(shí)例:

class Example5 extends Thread { **volatile boolean stop = false;** **volatile ServerSocket socket;** public static void main( String args[] ) throws Exception { Example5 thread = new Example5(); System.out.println( "Starting thread..." ); thread.start(); Thread.sleep( 3000 ); System.out.println( "Asking thread to stop..." ); **thread.stop = true;** **thread.socket.close();** Thread.sleep( 3000 ); System.out.println( "Stopping application..." ); //System.exit( 0 ); } public void run() { try { socket = new ServerSocket(7856); } catch ( IOException e ) { System.out.println( "Could not create the socket..." ); return; } **while ( !stop )** { System.out.println( "Waiting for connection..." ); try { Socket sock = socket.accept();**//SocketException extends IOException** } catch ( IOException e ) { System.out.println( "accept() failed or interrupted..." ); } } System.out.println( "Thread exiting under request..." ); }}
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陈巴尔虎旗| 西宁市| 漾濞| 邵阳县| 连城县| 彭泽县| 东至县| 招远市| 海原县| 红原县| 桦南县| 林芝县| 乡宁县| 栾城县| 武乡县| 保德县| 噶尔县| 西昌市| 莱西市| 千阳县| 杭锦后旗| 平昌县| 岳池县| 安泽县| 巴林左旗| 咸丰县| 修文县| 柯坪县| 正镶白旗| 如皋市| 长海县| 龙口市| 宁津县| 屏南县| 玛纳斯县| 平南县| 昆明市| 潮安县| 襄汾县| 凌云县| 敦煌市|