溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何中斷LockSupport線(xiàn)程

發(fā)布時(shí)間:2021-09-27 10:02:37 來(lái)源:億速云 閱讀:116 作者:柒染 欄目:編程語(yǔ)言

本篇文章為大家展示了如何中斷LockSupport線(xiàn)程,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

如何停止、中斷一個(gè)運(yùn)行中的線(xiàn)程??

線(xiàn)程api

如何中斷LockSupport線(xiàn)程

1)面試題:如何使用中斷標(biāo)識(shí)停止線(xiàn)程?

在需要中斷的線(xiàn)程中不斷監(jiān)聽(tīng)中斷狀態(tài),一旦發(fā)生中斷,就執(zhí)行相應(yīng)的中斷處理業(yè)務(wù)邏輯。

1.修改狀態(tài)

2.停止程序的運(yùn)行

2)方法

1.通過(guò)一個(gè)volatile變量實(shí)現(xiàn)

package com.lyy.juc;import java.util.concurrent.TimeUnit;public class InterruptDemo {private static volatile boolean isStop = false;public static void main(String[] args) {new Thread(()->{while (true){if(isStop){System.out.println(Thread.currentThread().getName()+"線(xiàn)程-----isStop = true,自己退出");break;
                }System.out.println("-------hello interrupt");

            }

        },"t1").start();try {TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }isStop = true;
    }
}

如何中斷LockSupport線(xiàn)程

主線(xiàn)程執(zhí)行,入口,發(fā)現(xiàn)睡了一秒,睡這一秒里,變量isStop一致為false,打印 -------hello interrupt ,一秒過(guò)去,isStop為true,線(xiàn)程t1執(zhí)行t1線(xiàn)程-----isStop = true,自己退出,break出循環(huán)

2.通過(guò)通過(guò)AtomicBoolean原子類(lèi)

package com.lyy.juc;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicBoolean;public class StopThreadDemo {private static final AtomicBoolean atomicBoolean = new AtomicBoolean(true);public static void main(String[] args) {new Thread(()->{while(atomicBoolean.get()){try {//O.5s                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }System.out.println("-------hello");
            }
        }).start();try {TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }atomicBoolean.set(false);
    }
}

如何中斷LockSupport線(xiàn)程

3通過(guò)Thread類(lèi)自帶的中斷api方法實(shí)現(xiàn)

實(shí)例方法interrupt(),沒(méi)有返回值

public void interrupt()

實(shí)例方法,
調(diào)用interrupt()方法僅僅是在當(dāng)前線(xiàn)程中打了一個(gè)停止的標(biāo)記,并不是真正立刻停止線(xiàn)程。


如何中斷LockSupport線(xiàn)程

實(shí)例方法isInterrupted,返回布爾值

public boolean isInterrupted()

實(shí)例方法,
獲取中斷標(biāo)志位的當(dāng)前值是什么,
判斷當(dāng)前線(xiàn)程是否被中斷(通過(guò)檢查中斷標(biāo)志位),默認(rèn)是false

如何中斷LockSupport線(xiàn)程

代碼

package com.lyy.juc;import java.util.concurrent.TimeUnit;public class InterruptDemo2{public static void main(String[] args)
    {Thread t1 = new Thread(() -> {while(true)
            {if(Thread.currentThread().isInterrupted())
                {System.out.println("-----t1 線(xiàn)程被中斷了,break,程序結(jié)束");break;
                }System.out.println("-----hello");
            }
        }, "t1");t1.start();System.out.println("**************"+t1.isInterrupted());//暫停1毫秒        try { TimeUnit.MILLISECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }t1.interrupt();System.out.println("**************"+t1.isInterrupted());
    }
}

**************false
-----hello

若干-----hello

**************true
-----t1 線(xiàn)程被中斷了,break,程序結(jié)束

4)當(dāng)前線(xiàn)程的中斷標(biāo)識(shí)為true,是不是就立刻停止?

 
具體來(lái)說(shuō),當(dāng)對(duì)一個(gè)線(xiàn)程,調(diào)用 interrupt() 時(shí):
 
①  如果線(xiàn)程處于正?;顒?dòng)狀態(tài),那么會(huì)將該線(xiàn)程的中斷標(biāo)志設(shè)置為 true,僅此而已。
被設(shè)置中斷標(biāo)志的線(xiàn)程將繼續(xù)正常運(yùn)行,不受影響。所以, interrupt() 并不能真正的中斷線(xiàn)程,需要被調(diào)用的線(xiàn)程自己進(jìn)行配合才行。
 
 
②  如果線(xiàn)程處于被阻塞狀態(tài)(例如處于sleep, wait, join 等狀態(tài)),在別的線(xiàn)程中調(diào)用當(dāng)前線(xiàn)程對(duì)象的interrupt方法,
那么線(xiàn)程將立即退出被阻塞狀態(tài),并拋出一個(gè)InterruptedException異常。

package com.lyy.juc;import java.util.concurrent.TimeUnit;public class InterruptDemo3 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("-------" + i);
            }System.out.println("after t1.interrupt()--第2次---: " + Thread.currentThread().isInterrupted());
        }, "t1");t1.start();System.out.println("before t1.interrupt()----: " + t1.isInterrupted());//實(shí)例方法interrupt()僅僅是設(shè)置線(xiàn)程的中斷狀態(tài)位設(shè)置為true,不會(huì)停止線(xiàn)程        t1.interrupt();//活動(dòng)狀態(tài),t1線(xiàn)程還在執(zhí)行中        try {TimeUnit.MILLISECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }System.out.println("after t1.interrupt()--第1次---: " + t1.isInterrupted());//非活動(dòng)狀態(tài),t1線(xiàn)程不在執(zhí)行中,已經(jīng)結(jié)束執(zhí)行了。        try {TimeUnit.MILLISECONDS.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }System.out.println("after t1.interrupt()--第3次---: " + t1.isInterrupted());
    }
}

如何中斷LockSupport線(xiàn)程

循環(huán)次數(shù)不同,結(jié)果順序不一樣,不過(guò)最終狀態(tài)改完后三個(gè)都為true

中斷只是一種協(xié)同機(jī)制,修改中斷標(biāo)識(shí)位僅此而已,不是立刻stop打斷

如何中斷LockSupport線(xiàn)程

6)靜態(tài)方法Thread.interrupted()

7)LockSupport

LockSupport是用來(lái)創(chuàng)建鎖和其他同步類(lèi)的基本線(xiàn)程阻塞原語(yǔ)。
 
下面這句話(huà),后面詳細(xì)說(shuō)
LockSupport中的park() 和 unpark() 的作用分別是阻塞線(xiàn)程和解除阻塞線(xiàn)程
 

上述內(nèi)容就是如何中斷LockSupport線(xiàn)程,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI