<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # ThreadGroup API介紹 TreadGroup其實是在1.5之前用的比較多,在沒有線程池API前都使用TreadGroupApi來管理線程池。雖然現在有線程池API來供大家使用,但是如果在平時開發中只想啟用三五個線程,那么可以選擇使用TreadGroup來管理線程。 我們找到ThreadGroup來看一下: ![](https://img.kancloud.cn/25/e4/25e41ab9d98756206dfd4eb83861f5bc_1040x196.png) 線程組表示一組線程。此外,線程組還可以包括其他線程組。線程組形成一個樹,其中除了初始線程組外,每個線程組都有一個父線程組。 允許線程訪問關于其自己線程組的信息,但不允許訪問關于其線程組的父線程組或任何其他線程組的信息。 那么,允許線程訪問關于其自己線程組的信息的信息都是什么呢?我們接下來看一下: 首先創建一個threadgroup ```java public class ThreadGroupCreate { public static void main(String[] args) { // 1. use the name ThreadGroup tg1 = new ThreadGroup("TG1"); Thread t1 = new Thread(tg1, () -> { while (true) { try { Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } }, "T1"); t1.start(); System.out.println("t1's thread group name = " + t1.getThreadGroup().getName());// TG1 //todo 2. use the parent and group name } } ``` 運行效果如下: ![](https://img.kancloud.cn/b5/cf/b5cf77e79d3a6e7734ee4c1264046ac9_856x228.gif) 打印一下當前threadgroup的名字和他父級的名字: ```java ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); System.out.println(threadGroup.getName()); System.out.println(threadGroup.getParent()); ``` 運行效果如下: ![](https://img.kancloud.cn/c8/f5/c8f53b73fd473c9eec218da2795a0fa2_856x210.gif) 可以看到他的線程組是TG1,他的夫級線程組是main,并且main線程的優先級很高是10。 接下來我們給創建另一個線程組,他的夫級線程組TG1: ```java //2. use the parent and group name ThreadGroup tg2 = new ThreadGroup(tg1, "TG2"); System.out.println("tg2's name = " + tg2.getName()); System.out.println("tg2's parent name = " + tg2.getParent().getName()); ``` 運行效果如下: ![](https://img.kancloud.cn/57/63/5763b80196fb7bf2cd42b4318f796118_856x210.gif) 線程組兩種創建方式就ok了,我們再來驗證一下:**允許線程訪問關于其自己線程組的信息,但不允許訪問關于其線程組的父線程組或任何其他線程組的信息**。 ```java //TG2 訪問TG1 ThreadGroup tg2 = new ThreadGroup(tg1, "TG2"); Thread t2 = new Thread(tg2,()->{ System.out.println("tg2's parent threadgroup is"+tg2.getName()); }); t2.start(); // TG3與TG1為同一個父ThreadGroup-main // 測試TG3能否訪問TG1的一些信息 ThreadGroup tg3 = new ThreadGroup("TG3"); Thread t3 = new Thread(tg3, () -> { System.out.println(">>>>" + t1.getName());// TG1 Thread[] threads = new Thread[tg1.activeCount()]; tg1.enumerate(threads); Stream.of(threads).forEach(System.out::println);// Thread[T1,5,TG1] }, "T3"); t3.start(); ``` 運行效果如下: 可以看到其實是可以訪問的,可能是官方文檔有問題,也有可能是我翻譯的有問題。。。 ## 接下來學習幾個ThreadGroup的常用方法: #### activeCount() ![](https://img.kancloud.cn/17/e6/17e66efebb2e29ff25be745fb9686c34_936x74.png) 返回此線程組及其子組中活動線程的評估數量。這里注意是評估數量,因為可能獲取的時候,某個線程消亡了或者正在被添加。 ```java public class ThreadGroupAPI { public static void main(String[] args) { ThreadGroup tg1 = new ThreadGroup("TG1"); Thread t1 = new Thread(tg1, () -> { while (true) { try { Thread.sleep(1_000); } catch (InterruptedException e) { e.printStackTrace(); break; } } }, "T1"); /*tg1.setDaemon(true);*/ t1.start(); ThreadGroup tg2 = new ThreadGroup(tg1, "TG2"); Thread t2 = new Thread(tg2, () -> { while (true) { try { Thread.sleep(1_000); } catch (InterruptedException e) { e.printStackTrace(); break; } } }, "T2"); t2.start(); System.out.println("tg1 active count is " + tg1.activeCount()); } } ``` 運行效果如下: ![](https://img.kancloud.cn/2d/d5/2dd551cec66963b7a1b5f4657b408b0c_856x204.gif) #### activeGroupCount() ![](https://img.kancloud.cn/d8/ad/d8adf4dfa87bf6c32bb9da1856d72370_988x73.png) 返回此線程組及其子組中活動組的評估數量。 ```java System.out.println(tg1.activeGroupCount()); ``` 運行效果如下: ![](https://img.kancloud.cn/41/c4/41c4fdaa7e6069e839688e97de7b84b6_856x204.gif) #### checkAccess() ![](https://img.kancloud.cn/ec/86/ec86f140dcc70baa88c448b81b36c80b_974x183.png) 確定當前運行的線程是否具有修改此線程組的權限。 代碼如下: ```java tg1.checkAccess(); ``` 運行效果如下: ![](https://img.kancloud.cn/73/c0/73c0aed27de40a0d0500f7a3ddb2bbef_856x204.gif) 沒拋出異常代表有權限修改線程組。 #### destroy() ![](https://img.kancloud.cn/4e/7f/4e7fcb1d5631be321c7879745d7f09bc_1001x358.png) 銷毀這個線程組及其所有子組。destroy前需要確定線程組里沒有活躍的線程。如果線程組不為空或線程組已被銷毀將拋出`IllegalThreadStateException` 代碼如下: ```java tg1.destroy(); ``` 運行效果如下: ![](https://img.kancloud.cn/cf/f8/cff8748ac36a557d497ee06eaecdd489_856x204.gif) 因為我們線程里有while,所以是活躍的線程,這里就拋出異常了。 #### enumerate(Thread[] list) ![](https://img.kancloud.cn/e0/9e/e09e82ceef838da81735587a37052198_1007x63.png) 將此線程組及其子組中的每個活動線程復制到指定的數組中。 代碼如下: ```java Thread[] ts1 = new Thread[tg1.activeCount()]; tg1.enumerate(ts1); System.out.println(Arrays.toString(ts1)); ``` 運行效果如下: ![](https://img.kancloud.cn/83/77/837708808a254e70da07d5fefcc9eaa0_856x204.gif) #### enumerate(Thread[] list, boolean recurse) ![](https://img.kancloud.cn/65/42/6542dd63177dab38570e94f03b74844a_989x59.png) 將此線程組中的每個活動線程復制到指定數組中。 代碼如下: ```java Thread[] ts2 = new Thread[tg1.activeCount()]; tg1.enumerate(ts2, false); System.out.println(Arrays.toString(ts2)); ``` 運行效果如下: ![](https://img.kancloud.cn/27/8a/278ae01318a672e540c5a5c1d26a8306_856x204.gif) ![](https://img.kancloud.cn/f3/27/f3279d4eb8de00be721f15cb3a1e7b7e_695x89.png) 如果為真,則遞歸枚舉此線程組的所有子組。那么我們使用false試試: ```java ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup(); Thread[] ts3 = new Thread[mainThreadGroup.activeCount()]; mainThreadGroup.enumerate(ts3, false); System.out.println(Arrays.toString(ts3)); ``` 運行效果如下: ![](https://img.kancloud.cn/06/93/0693469c5f2090606ad1784b4141a75c_856x204.gif) #### interrupt() ![image-20200919161631996](23.ThreadGroup API介紹.assets/image-20200919161631996.png) 中斷此線程組中的所有線程。 代碼如下: ```java tg1.interrupt(); ``` 運行效果如下: ![](https://img.kancloud.cn/e8/43/e8434754e9fe1973313a4b749c21aefc_856x204.gif) #### setDaemon(boolean daemon) ![](https://img.kancloud.cn/74/42/744241563a82d74a95162876b5e4317b_977x337.png) 守護進程——如果為真,則將此線程組標記為守護線程組;否則,將此線程組標記為normal。 ```java ThreadGroup tg1 = new ThreadGroup("TG1"); Thread t1 = new Thread(tg1, () -> { try { Thread.sleep(1_000); } catch (InterruptedException e) { e.printStackTrace(); } }, "T1"); tg1.setDaemon(true); t1.start(); Thread.sleep(2_000); System.out.println(tg1.isDestroyed()); ``` 運行效果如下: ![](https://img.kancloud.cn/72/08/72085452b18ce08afd6cf263c5c29281_856x204.gif) 注釋tg1.setDaemon(true);試一下: ![](https://img.kancloud.cn/f4/65/f4658dada63c8fd5fe6ce065a98d442b_856x204.gif) 手動銷毀一下: ```java ThreadGroup tg1 = new ThreadGroup("TG1"); Thread t1 = new Thread(tg1, () -> { try { Thread.sleep(1_000); } catch (InterruptedException e) { e.printStackTrace(); } }, "T1"); //tg1.setDaemon(true); t1.start(); Thread.sleep(2_000); System.out.println(tg1.isDestroyed()); tg1.destroy(); System.out.println(tg1.isDestroyed()); ``` 運行效果如下: ![](https://img.kancloud.cn/e8/3f/e83f109c12355e772e73c497d6356327_856x204.gif) 這篇隨筆是我周六沒吃早飯沒吃午飯弄到下午4點38才弄完的,中間多少次想休息一會吃個飯再繼續弄,但是還是想弄完了再好好吃飯,也許這樣下去永遠都胖不起來吧。。。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看