第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java線程中斷僅等待、加入和睡眠

Java線程中斷僅等待、加入和睡眠

阿晨1998 2023-10-19 21:53:37
Thread.interrupt():中斷該線程。除非當前線程正在中斷自身(這始終是允許的),否則將調(diào)用該線程的 checkAccess 方法,這可能會導(dǎo)致拋出 SecurityException。如果此線程在調(diào)用Object 類的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 時被阻止、 sleep(long) 或 sleep(long, int) 等此類方法,則其中斷狀態(tài)將被清除,并會收到 InterruptedException。如果該線程在 InterruptibleChannel 上的I/O 操作中被阻塞,則該通道將被關(guān)閉,該線程的中斷狀態(tài)將被設(shè)置,并且該線程將收到 ClosedByInterruptException。如果該線程在選擇器中被阻塞,則該線程的中斷狀態(tài)將被設(shè)置,并且它將立即從選擇操作中返回,可能返回一個非零值,就像調(diào)用選擇器的喚醒方法一樣。如果前面的條件都不成立,則該線程的中斷狀態(tài)將被設(shè)置。中斷不活動的線程不需要產(chǎn)生任何效果。假設(shè)我們有這樣的代碼:AtomicBoolean thread1Done = new AtomicBoolean(false);//write in fileThread thread1 = new Thread(() -> {    try(var writer = Files.newBufferedWriter(Paths.get("foo.txt"))){        for(int i = 0; i < 10000; i++){            writer.write(i);            writer.newLine();        }    }catch(Exception e){ e.printStackTrace(); }    thread1Done.set(true);});//interrupt thread1Thread thread2 = new Thread(() -> {    while(!thread1Done.get()){        thread1.interrupt();    }});thread2.start();thread1.start();thread1由于thread1.interrupt()from ,從不在文件中寫入任何內(nèi)容thread2。java.nio.channels.ClosedByInterruptException它總是以at結(jié)尾writer.newLine();并且foo.txt為空。有沒有辦法只打斷wait, join and sleep,而忽略其余的?我在 Windows10 x64 上使用 JDK10 運行我的代碼。
查看完整描述

2 回答

?
慕森卡

TA貢獻1806條經(jīng)驗 獲得超8個贊

如果您想要的是僅在線程被 wait、join 和 sleep 調(diào)用阻塞而不是 IO 操作時中斷線程,您可以在調(diào)用中斷方法之前簡單地檢查線程狀態(tài)。您可以參考以下鏈接中的 api 和不同狀態(tài)。

https://docs.oracle.com/javase/10/docs/api/java/lang/Thread.State.html

示例代碼可能如下所示。

while ( ( thread1.getState() == Thread.State.WAITING || thread1.getState() == Thread.State.TIMED_WAITING ) && !thread1Done.get()) {
    thread1.interrupt();
}


查看完整回答
反對 回復(fù) 2023-10-19
?
侃侃無極

TA貢獻2051條經(jīng)驗 獲得超10個贊

按照目前的情況,您的代碼運行完成將Thread 110k 行寫入輸出文本文件,換句話說是中斷,但其中Thread 2沒有可中斷的語句。這是因為(我想)使用不間斷 I/O打開文件。Thread 1BufferedWriter


如果您希望長循環(huán)是Thread 1可中斷的,您可以在長時間運行的循環(huán)中添加以下檢查:


for(int i = 0; i < 10000; i++){

    if (Thread.currentThread().isInterrupted()) {    //interruptible loop

        break;

    }

    writer.write(i);

    writer.newLine();

    System.out.println(i);

}

然后,通過將中斷延遲Thread 210 毫秒,我發(fā)現(xiàn)只有幾百個條目被寫入文件(沒有延遲,它會立即中斷)。


當我切換Thread 1為使用可中斷通道

時(按原樣FileChannel extends AbstractInterruptibleChannel):


Thread thread1 = new Thread(() -> {

    FileChannel fc = null;

    try ( 

       FileChannel fc = FileChannel.open(Paths.get("foo.txt"), 

                        StandardOpenOption.CREATE, StandardOpenOption.WRITE);

    )

    {

       fc = FileChannel.open(Paths.get("foo.txt"), 

          StandardOpenOption.CREATE, StandardOpenOption.WRITE

       );


       for(int i = 0; i < 10000; i++){

           fc.write(ByteBuffer.wrap(("" + i).getBytes()));

           fc.write(ByteBuffer.wrap(("\n").getBytes()));

           System.out.println(i);

       }

    } catch (Exception e) {

       e.printStackTrace();

    } 

}

...我確實得到了很好的可中斷文件寫入線程。


查看完整回答
反對 回復(fù) 2023-10-19
  • 2 回答
  • 0 關(guān)注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號