91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何中斷LockSupport線程

發布時間:2021-09-27 10:02:37 來源:億速云 閱讀:116 作者:柒染 欄目:編程語言

本篇文章為大家展示了如何中斷LockSupport線程,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

如何停止、中斷一個運行中的線程??

線程api

如何中斷LockSupport線程

1)面試題:如何使用中斷標識停止線程?

在需要中斷的線程中不斷監聽中斷狀態,一旦發生中斷,就執行相應的中斷處理業務邏輯。

1.修改狀態

2.停止程序的運行

2)方法

1.通過一個volatile變量實現

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()+"線程-----isStop = true,自己退出");break;
                }System.out.println("-------hello interrupt");

            }

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

如何中斷LockSupport線程

主線程執行,入口,發現睡了一秒,睡這一秒里,變量isStop一致為false,打印 -------hello interrupt ,一秒過去,isStop為true,線程t1執行t1線程-----isStop = true,自己退出,break出循環

2.通過通過AtomicBoolean原子類

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線程

3通過Thread類自帶的中斷api方法實現

實例方法interrupt(),沒有返回值

public void interrupt()

實例方法,
調用interrupt()方法僅僅是在當前線程中打了一個停止的標記,并不是真正立刻停止線程。


如何中斷LockSupport線程

實例方法isInterrupted,返回布爾值

public boolean isInterrupted()

實例方法,
獲取中斷標志位的當前值是什么,
判斷當前線程是否被中斷(通過檢查中斷標志位),默認是false

如何中斷LockSupport線程

代碼

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 線程被中斷了,break,程序結束");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 線程被中斷了,break,程序結束

4)當前線程的中斷標識為true,是不是就立刻停止?

 
具體來說,當對一個線程,調用 interrupt() 時:
 
①  如果線程處于正常活動狀態,那么會將該線程的中斷標志設置為 true,僅此而已。
被設置中斷標志的線程將繼續正常運行,不受影響。所以, interrupt() 并不能真正的中斷線程,需要被調用的線程自己進行配合才行。
 
 
②  如果線程處于被阻塞狀態(例如處于sleep, wait, join 等狀態),在別的線程中調用當前線程對象的interrupt方法,
那么線程將立即退出被阻塞狀態,并拋出一個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());//實例方法interrupt()僅僅是設置線程的中斷狀態位設置為true,不會停止線程        t1.interrupt();//活動狀態,t1線程還在執行中        try {TimeUnit.MILLISECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }System.out.println("after t1.interrupt()--第1次---: " + t1.isInterrupted());//非活動狀態,t1線程不在執行中,已經結束執行了。        try {TimeUnit.MILLISECONDS.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }System.out.println("after t1.interrupt()--第3次---: " + t1.isInterrupted());
    }
}

如何中斷LockSupport線程

循環次數不同,結果順序不一樣,不過最終狀態改完后三個都為true

中斷只是一種協同機制,修改中斷標識位僅此而已,不是立刻stop打斷

如何中斷LockSupport線程

6)靜態方法Thread.interrupted()

7)LockSupport

LockSupport是用來創建鎖和其他同步類的基本線程阻塞原語。
 
下面這句話,后面詳細說
LockSupport中的park() 和 unpark() 的作用分別是阻塞線程和解除阻塞線程
 

上述內容就是如何中斷LockSupport線程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武乡县| 榆林市| 东丽区| 镇巴县| 建宁县| 炎陵县| 乌审旗| 永新县| 兰溪市| 靖安县| 鄢陵县| 民县| 丹阳市| 颍上县| 麟游县| 永仁县| 洮南市| 墨玉县| 商水县| 手游| 锦屏县| 大连市| 法库县| 望谟县| 高平市| 赣榆县| 涿鹿县| 延安市| 海兴县| 仙居县| 安多县| 安化县| 宜都市| 赣州市| 神池县| 石河子市| 拜城县| 莫力| 宁南县| 阳谷县| 汉寿县|