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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 創建并啟動線程 ## 場景: 假如我現在需要在讀數據庫的同時往磁盤里寫數據,這個要怎么做呢? ```java package com.thread.thread01; /** * @program: ThreadDemo * @description: 創建并啟動線程 * @author: hs96.cn@Gmail.com * @create: 2020-08-26 09:56 */ public class TryConcurrency { public static void main(String[] args) { readFromDataBase(); writeDataToFile(); } /** * 讀數據 */ private static void readFromDataBase() { // read data from database and handle it try { println("Begin read data from db."); Thread.sleep(1000 * 1L); println("Read data done and start handle it."); } catch (InterruptedException e) { e.printStackTrace(); } println("The data handle finish and successfully."); } /** * 寫數據 */ private static void writeDataToFile() { // write data to file try { println("Begin write data to file."); Thread.sleep(1000 * 1L); println("Write data done and start handle it."); } catch (InterruptedException e) { e.printStackTrace(); } println("The data handle finish and successfully."); } private static void println(String message) { System.out.println(message); } } ``` 運行效果如下: ![](https://img.kancloud.cn/77/3b/773b064db5b5388d3b3e0c9262c341c4_1040x224.gif) 可以看到這兩個方法其實是順序執行的不是交替執行的,接下來我們打開JDK的文檔,找到Thread類: ![](https://img.kancloud.cn/61/9b/619be298ecc5ad1dd3efc12308526059_1416x685.png) 可以看到在JVM啟動的時候其實有一個非守護的main線程來啟動我們的main函數。 為了驗證這個,我們來創建一個`sleep`的線程,我們來使用`jconsole`工具來查看一下: ```java public static void main(String[] args) { try { Thread.sleep(1000 * 100L); } catch (InterruptedException e) { e.printStackTrace(); } } ``` ![](https://img.kancloud.cn/8e/14/8e14e3ddacf2dad7b25fdc850592ce8f_757x198.png) ![](https://img.kancloud.cn/89/c0/89c0fc3ddf5d92ac54f44f38ceb83eb2_300x60.png) ![](https://img.kancloud.cn/bc/6d/bc6d2c9dbad2a10273ffb0e2b93c837e_900x750.png) ![](https://img.kancloud.cn/3b/ee/3bee0c312a354684e78020438ab7b29a_900x750.png) 可以看到是有一個main線程存在的,他是waiting狀態,所以,我們可以在main方法里,再創建一個線程,讓這兩個線程交替打印一下數字: ```java public static void main(String[] args) { Thread t1 = new Thread("Custom-Thread") { @Override public void run() { for (int i = 0; i < 1000; i++) { println("Task i=>" + i); try { Thread.sleep(1000 * 1L); } catch (InterruptedException e) { e.printStackTrace(); } } } }; t1.start(); for (int j = 0; j < 1000; j++) { try { Thread.sleep(900 * 1L); } catch (InterruptedException e) { e.printStackTrace(); } println("Task j=>" + j); } } ``` 效果如下: ![](https://img.kancloud.cn/31/b5/31b50009cd35a96ebe07c1dc6214c2b0_1040x224.gif) 可以看到這兩個線程已經交替執行了。 再用`jconsole`查看一下: ![](https://img.kancloud.cn/64/00/64002fa8fab6983fd18efd7d7648cbe3_882x317.png) 把main線程的循環注釋掉: ```java public static void main(String[] args) { Thread t1 = new Thread("Custom-Thread") { @Override public void run() { for (int i = 0; i < 1000; i++) { println("Task i=>" + i); try { Thread.sleep(1000 * 1L); } catch (InterruptedException e) { e.printStackTrace(); } } } }; t1.start(); /*for (int j = 0; j < 1000; j++) { try { Thread.sleep(900 * 1L); } catch (InterruptedException e) { e.printStackTrace(); } println("Task j=>" + j); }*/ } ``` 再用`jconsole`查看一下: ![](https://img.kancloud.cn/78/c1/78c1bab0db36a46b2c76b9c6bf17cd3d_869x272.png) main線程已經退出了。 還有一個容易忽略的問題: ![](https://img.kancloud.cn/f7/85/f785cabc6db12f0e469bbf9d08ff69a4_725x455.png) 顯然不是,因為執行結果直接就出來了: ![](https://img.kancloud.cn/3c/a4/3ca412a501df2c0908d0f55e3a2b4081_574x115.png) 這里涉及到線程的生命周期了,后續再深入學習,這里只提一下。 現在再思考之前提出的問題:假如我現在需要在讀數據庫的同時往磁盤里寫數據,這個要怎么做呢? ```java /** * @program: ThreadDemo * @description: 創建并啟動線程 * @author: hs96.cn@Gmail.com * @create: 2020-08-26 09:56 */ public class TryConcurrency { public static void main(String[] args) { new Thread("READ-Thread") { @Override public void run() { readFromDataBase(); } }.start(); new Thread("WRITE-Thread") { @Override public void run() { writeDataToFile(); } }.start(); } /** * 讀數據 */ private static void readFromDataBase() { // read data from database and handle it try { println("Begin read data from db."); Thread.sleep(1000 * 1L); println("Read data done and start handle it."); } catch (InterruptedException e) { e.printStackTrace(); } println("The data handle finish and successfully."); } /** * 寫數據 */ private static void writeDataToFile() { // write data to file try { println("Begin write data to file."); Thread.sleep(1000 * 1L); println("Write data done and start handle it."); } catch (InterruptedException e) { e.printStackTrace(); } println("The data handle finish and successfully."); } private static void println(String message) { System.out.println(message); } } ``` 執行效果如下: ![](https://img.kancloud.cn/17/ec/17ec8a7953586a6d544767194d5e009b_1040x224.gif) 可以看到已經交替執行了。 再用`jconsole`查看一下: ![](https://img.kancloud.cn/8d/fa/8dfaa668cf39a003d07f3bbe290d9b1b_862x322.png) 這樣我們就簡單的實現了讀數據庫的同時往磁盤里寫數據的操作。當然雖然沒真正的讀數據庫和往磁盤里寫數據,但是,主要還是理解這個交替執行的過程。
                  <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>

                              哎呀哎呀视频在线观看