java中斷
㈠ java如何中斷Http請求線程
1、線程被wait、join、sleep等方法阻塞時,interrupt將清除一個中斷狀態並接收到一個InterruptedException異常。
2、如果線程是被IO操作阻塞的,且這個IO是基於InterruptibleChannel的,那麼這channel將被關閉,thread的中斷狀態將被設置,而且thread會收到一個java.nio.channels.ClosedByInterruptException異常。
3、如果這個線程是被阻塞在 java.nio.channels.Selector的,那麼線程的中斷狀態將被設置並且將立刻從selection操作中返回,可能會返回非0值,就像wakeup方法被調用的那樣。
㈡ Java中如何中斷線程
1: 給你的線程類一個標識符,然後在循環中對這個標志做判斷,如果為false則跳出循環,自動結束線程(線程在run()裡面執行完就自動關閉了),而你可以再線程外對這個標識符做控制。2: 對線程對象調用interrupt(),這樣在run中使用sleep,wait等方法時自動拋出一個InterruptedException異常,在catch裡面可以跳出循環。
㈢ 雲南java培訓分享線程的中斷分為哪些情況
相信大家在使用電腦的時候都有過這樣的現象,就是在運行一個程序的時候,突然發現不需要了或者是需要啟用其他軟體的時候,我們會強制關閉這個軟體的啟動過程,雲南java培訓http://www.kmbdqn.com/認為這個行為在java編程開發中就叫做線程的中斷。
每一個線程都有一個boolean類型標志,用來表明當前線程是否請求中斷,當一個線程調用interrupt()方法時,線程的中斷標志將被設置為true。
我們可以通過調用Thread.currentThread().isInterrupted()或者Thread.interrupted()來檢測線程的中斷標志是否被置位。這兩個方法的區別是
Thread.currentThread().isInterrupted()是線程對象的方法,調用它後不清除線程中斷標志位;而Thread.interrupted()是一個靜態方法,調用它會清除
線程中斷標志位。
一般來說中斷線程分為三種情況:
(一):中斷非阻塞線程
(二):中斷阻塞線程
(三):不可中斷線程
(一):中斷非阻塞線程
中斷非阻塞線程通常有兩種方式:
(1)採用線程共享變數
這種方式比較簡單可行,需要注意的一點是共享變數必須設置為volatile,這樣才能保證修改後其他線程立即可見。
(2)採用中斷機制
(二):中斷阻塞線程
當線程調用Thread.sleep()、Thread.join()、object.wait()再或者調用阻塞的i/o操作方法時,都會使得當前線程進入阻塞狀態。那麼此時如果在線程處於阻塞狀態是調用
interrupt()方法設置線程中斷標志位時會出現什麼情況呢!此時處於阻塞狀態的線程會拋出一個異常,並且會清除線程中斷標志位(設置為false)。這樣一來線程就能退出
阻塞狀態。當然拋出異常的方法就是造成線程處於阻塞狀態的Thread.sleep()、Thread.join()、object.wait()這些方法。
需要注意的地方就是Thread.sleep()、Thread.join()、object.wait()這些方法,會檢測線程中斷標志位,如果發現中斷標志位為true則拋出異常並且將中斷標志位設置為false。
所以while循環之後每次調用阻塞方法後都要在捕獲異常之後,調用Thread.currentThread().interrupt()重置狀態標志位。
(三):不可中斷線程
有一種情況是線程不能被中斷的,就是調用synchronized關鍵字和reentrantLock.lock()獲取鎖的過程。
但是如果調用帶超時的tryLock方法reentrantLock.tryLock(longtimeout,TimeUnitunit),那麼如果線程在等待時被中斷,將拋出一個InterruptedException異常,這是一個非常
有用的特性,因為它允許程序打破死鎖。你也可以調用reentrantLock.lockInterruptibly()方法,它就相當於一個超時設為無限的tryLock方法。
㈣ java線程哪些情況會中斷
涉及到數據共享及數據的修改的情況下一般要考慮線程安全,比如有一個原始數據5,我在一個線程中要將這個數據加5,那麼我就在這個線程中讀取到這個數據然後加5得到10,然後再把10存入這個原始數據中,因為沒有考慮線程安全,在我存入之前,有另一個線程修改了這個數據,把原始數據修改為0,然後之前的線程又才將10存入那個原始數據,那麼此時這個原始數據就成為了10,然後因為之前有線程修改過,實際應該為5,這里只是數字,如果這個數字是錢呢?你的賬戶就會憑空多出錢來!還有很多種出錯的情況,這里只是其中一種,所以在某些情況下必須要考慮線程安全性
㈤ java什麼情況會導致程序中斷
1,線程正常執行完畢,正常結束。 2,監視某些條件,結束線程的不間斷運行。 3,捕獲InterruptedException 運行時異常,中斷當前線程。 也不知道對不對,湊合著看吧。
㈥ Java中如何實現線程的超時中斷
如果你是要在子線程超時後直接關閉的話可以這樣:
exec=Executors.newFixedThreadPool(1);
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
//開始操作
//TimeTaskTest.star(null);
return "線程執行完成";
}
};
Future<String> future = exec.submit(call);
//設置為30分鍾超時
future.get(1000*60*time , TimeUnit.MILLISECONDS);
=========================================
如果你是在進行其他操作的話那就比較麻煩了,目前我想到的是在子線程中一直訪問某個變數,超時時守護線程改變這個值,然後子線程讀到後退出,不過這個有個問題,就是當子線程卡死在某個環節時完全無用
㈦ JAVA代碼運行中斷
換個實現方式。
try {
// 讀取圖片文件
is = new FileInputStream(srcpath);
/**
* 返回包含所有當前已注冊 ImageReader 的 Iterator,這些 ImageReader 聲稱能夠解碼指定格式。 參數:formatName - 包含非正式格式名稱 . (例如 "jpeg" 或 "tiff")等 。
*/
Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = it.next();
// 獲取圖片流
iis = ImageIO.createImageInputStream(is);
/**
* iis:讀取源.true:只向前搜索.將它標記為 『只向前搜索』。 此設置意味著包含在輸入源中的圖像將只按順序讀取,可能允許 reader 避免緩存包含與以前已經讀取的圖像關聯的數據的那些輸入部分。
*/
reader.setInput(iis, true);
/**
* <p>
* 描述如何對流進行解碼的類
* <p>
* .用於指定如何在輸入時從 Java Image I/O 框架的上下文中的流轉換一幅圖像或一組圖像。用於特定圖像格式的插件 將從其 ImageReader 實現的 getDefaultReadParam 方法中返回 ImageReadParam 的實例。
*/
ImageReadParam param = reader.getDefaultReadParam();
/**
* 圖片裁剪區域。Rectangle 指定了坐標空間中的一個區域,通過 Rectangle 對象 的左上頂點的坐標(x,y)、寬度和高度可以定義這個區域。
*/
Rectangle rect = new Rectangle(x, y, width, height);
// 提供一個 BufferedImage,將其用作解碼像素數據的目標。
param.setSourceRegion(rect);
/**
* 使用所提供的 ImageReadParam 讀取通過索引 imageIndex 指定的對象,並將 它作為一個完整的 BufferedImage 返回。
*/
BufferedImage bi = reader.read(0, param);
// 保存新圖片
ImageIO.write(bi, "jpg", new File(subpath));
}catch(Exception e){
e.printStackTrace();
}
finally {
if (is != null)
is.close();
if (iis != null)
iis.close();
}