一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談Java多線程的優點及代碼示例

淺談Java多線程的優點及代碼示例

2021-01-30 11:50Jakob Jenkov Java教程

這篇文章主要介紹了淺談Java多線程的優點及代碼示例,還是比較不錯的,這里分享給大家,需要的朋友可以參考。

盡管面臨很多挑戰,多線程有一些優點使得它一直被使用。這些優點是:

資源利用率更好
程序設計在某些情況下更簡單
程序響應更快
資源利用率更好

想象一下,一個應用程序需要從本地文件系統中讀取和處理文件的情景。比方說,從磁盤讀取一個文件需要5秒,處理一個文件需要2秒。處理兩個文件則需要:

?
1
2
3
4
5
6
5秒讀取文件A
2秒處理文件A
5秒讀取文件B
2秒處理文件B
---------------------
總共需要14秒

從磁盤中讀取文件的時候,大部分的CPU時間用于等待磁盤去讀取數據。在這段時間里,CPU非常的空閑。它可以做一些別的事情。通過改變操作的順序,就能夠更好的使用CPU資源。看下面的順序:

?
1
2
3
4
5
5秒讀取文件A
5秒讀取文件B + 2秒處理文件A
2秒處理文件B
---------------------
總共需要12秒

CPU等待第一個文件被讀取完。然后開始讀取第二個文件。當第二文件在被讀取的時候,CPU會去處理第一個文件。記住,在等待磁盤讀取文件的時候,CPU大部分時間是空閑的。

總的說來,CPU能夠在等待IO的時候做一些其他的事情。這個不一定就是磁盤IO。它也可以是網絡的IO,或者用戶輸入。通常情況下,網絡和磁盤的IO比CPU和內存的IO慢的多。

程序設計更簡單

在單線程應用程序中,如果你想編寫程序手動處理上面所提到的讀取和處理的順序,你必須記錄每個文件讀取和處理的狀態。相反,你可以啟動兩個線程,每個線程處理一個文件的讀取和操作。線程會在等待磁盤讀取文件的過程中被阻塞。在等待的時候,其他的線程能夠使用CPU去處理已經讀取完的文件。其結果就是,磁盤總是在繁忙地讀取不同的文件到內存中。這會帶來磁盤和CPU利用率的提升。而且每個線程只需要記錄一個文件,因此這種方式也很容易編程實現。

程序響應更快

將一個單線程應用程序變成多線程應用程序的另一個常見的目的是實現一個響應更快的應用程序。設想一個服務器應用,它在某一個端口監聽進來的請求。當一個請求到來時,它去處理這個請求,然后再返回去監聽。

服務器的流程如下所述:

?
1
2
3
4
while(server is active){
  listen for request
  process request
}

如果一個請求需要占用大量的時間來處理,在這段時間內新的客戶端就無法發送請求給服務端。只有服務器在監聽的時候,請求才能被接收。另一種設計是,監聽線程把請求傳遞給工作者線程(worker thread),然后立刻返回去監聽。而工作者線程則能夠處理這個請求并發送一個回復給客戶端。這種設計如下所述:

?
1
2
3
4
while(server is active){
  listen for request
  hand request to worker thread
}

這種方式,服務端線程迅速地返回去監聽。因此,更多的客戶端能夠發送請求給服務端。這個服務也變得響應更快。
桌面應用也是同樣如此。如果你點擊一個按鈕開始運行一個耗時的任務,這個線程既要執行任務又要更新窗口和按鈕,那么在任務執行的過程中,這個應用程序看起來好像沒有反應一樣。相反,任務可以傳遞給工作者線程(word thread)。當工作者線程在繁忙地處理任務的時候,窗口線程可以自由地響應其他用戶的請求。當工作者線程完成任務的時候,它發送信號給窗口線程。窗口線程便可以更新應用程序窗口,并顯示任務的結果。對用戶而言,這種具有工作者線程設計的程序顯得響應速度更快。

下面是借鑒別人的一個Java多線程的例子,感謝。

問題:三個售票窗口同時出售20張票;

程序分析:

1.票數要使用同一個靜態值
2.為保證不會出現賣出同一個票數,要java多線程同步鎖。

設計思路:1.創建一個站臺類Station,繼承Thread,重寫run方法,在run方法里面執行售票操作!售票要使用同步鎖:即有一個站臺賣這張票時,其他站臺要等這張票賣完!

創建主方法調用類

(一)創建一個站臺類,繼承Thread

(原文有一點點小錯誤,小編已經更正,大家請放心測試使用)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.xykj.threadStation;
public class Station extends Thread {
    // 通過構造方法給線程名字賦值
    public Station(String name) {
        super(name);
        // 給線程名字賦值
    }
    // 為了保持票數的一致,票數要靜態
    static int tick = 20;
    // 創建一個靜態鑰匙
    static Object ob = "aa";
    //值是任意的
    // 重寫run方法,實現買票操作
    @Override
    public void run() {
        while (tick > 0) {
            synchronized (ob) {
                // 這個很重要,必須使用一個鎖,
                // 進去的人會把鑰匙拿在手上,出來后才把鑰匙拿讓出來
                if (tick > 0) {
                    System.out.println(getName() + "賣出了第" + tick + "張票");
                    tick--;
                } else {
                    System.out.println("票賣完了");
                }
            }
            try {
                sleep(1000);
                //休息一秒
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

(二)創建主方法調用類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.xykj.threadStation;
public class MainClass {
    /**
* java多線程同步鎖的使用
* 示例:三個售票窗口同時出售10張票
* */
    public static void main(String[] args) {
        //實例化站臺對象,并為每一個站臺取名字
        Station station1=new Station("窗口1");
        Station station2=new Station("窗口2");
        Station station3=new Station("窗口3");
        // 讓每一個站臺對象各自開始工作
        station1.start();
        station2.start();
        station3.start();
    }
}

運行結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
窗口1賣出了第20張票
窗口2賣出了第19張票
窗口3賣出了第18張票
窗口1賣出了第17張票
窗口2賣出了第16張票
窗口3賣出了第15張票
窗口3賣出了第14張票
窗口2賣出了第13張票
窗口1賣出了第12張票
窗口3賣出了第11張票
窗口2賣出了第10張票
窗口1賣出了第9張票
窗口1賣出了第8張票
窗口2賣出了第7張票
窗口3賣出了第6張票
窗口1賣出了第5張票
窗口3賣出了第4張票
窗口2賣出了第3張票
窗口3賣出了第2張票
窗口2賣出了第1張票
票賣完了

總結

以上就是本文關于淺談Java多線程的優點及代碼示例的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

原文鏈接:http://tutorials.jenkov.com/java-concurrency/benefits.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产在线视频中文字 | youzljzljzljzlj96| 美女视频一区二区三区在线 | 国产一级一级片 | 赤坂丽女医bd无删减在线观看 | 九9热这里只有真品 | 含羞草传媒一天免费看下 | 亚洲欧美综合人成野草 | av在线色| 国产精品亚洲精品青青青 | 欧美色青 | 99热精品久久 | 成人18视频在线观看 | 白丝校花被扒开双腿喷水小说 | 国产免费丝袜调教视频 | 香蕉国产人午夜视频在线观看 | 日本理论片中文在线观看2828 | 成人涩涩屋福利视频 | 99久久国产视频 | tube性睡觉hd| 黑人巨大和日本娇小中出 | 好大好硬好紧太深了受不了 | 60老妇性xxxxhd | jk制服蕾丝超短裙流白浆 | 关晓彤一级做a爰片性色毛片 | 四虎影院在线免费 | 精品久久久久久午夜 | 91av免费在线观看 | 亚洲视频在线免费观看 | 欧美贵妇videos办公室 | 日本狠狠操 | 亚洲国产在线99视频 | 四虎官网| 毛片一级免费 | 日本96在线精品视频免费观看 | 91亚色视频在线观看 | 久99久热只有精品国产99 | 男男gaygays18中国 | yellow视频在线观看免费 | 视频在线观看国产 | 欧美性理论片在线观看片免费 |