java - barrier

來源:趣味經驗館 2.12W

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java barrier是什麼,讓我們一起了解一下?

barrier是Java中的CyclicBarrier,是可循環使用的屏障,要做的事情就是讓一組線程到達一個屏障時被阻塞,直到最後一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續運行。

CyclicBarrier有什麼常用方法?

首先在所有參與者都已經在此 barrier 上調用 await方法之前,將被一直等待。如果當前線程不是將到達的最後一個線程,出於調度目的,將禁用它,且在發生以下情況之一前,該線程將一直處於休眠狀態。

最後一個線程到達,或者其他某個線程中斷當前線程,或者其他某個線程中斷另一個等待線程,或者其他某個線程在等待 barrier 時超時,或者其他某個線程在此 barrier 上調用 reset()。

java barrier

如果當前線程在進入此方法時已經設置了該線程的中斷狀態,或者在等待時被中斷,則拋出 InterruptedException,並且清除當前線程的已中斷狀態。

如果在線程處於等待狀態時 barrier 被 reset(),或者在調用 await 時 barrier 被損壞,抑或任意一個線程正處於等待狀態,則出 BrokenBarrierException 異常。

如果任何線程在等待時被中斷,則其他所有等待線程都將拋出 BrokenBarrierException 異常,並將 barrier 置於損壞狀態。

如果當前線程是最後一個將要到達的線程,並且構造方法中提供了一個非空的屏障操作,則在允許其他線程繼續運行之前,當前線程將運行該操作。如果在執行屏障操作過程中發生異常,則該異常將傳播到當前線程中,並將 barrier 置於損壞狀態。

示例代碼如下:

public static void main(String[] args) {    CyclicBarrier c = new CyclicBarrier(2);    Thread t1 = new Thread(){        @Override        public void run() {            System.out.println("我到了");            try {                c.await();            }catch (Exception e){                e.printStackTrace();            }        }    };    t1.start();    System.out.println("我到了");    try {        c.await();    }catch (Exception e){        e.printStackTrace();    }    System.out.println("門開了");}

熱門標籤