黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java實戰教程,實現網絡之并發編程

Java實戰教程,實現網絡之并發編程

更新時間:2020-05-12 16:14:42 來源:動力節點 瀏覽2387次

1.并發與并行

個人理解并發就是在時間上運行程序(即不同任務在不同時間片上運行),并行就是在空間上運行程序(即不同任務在不同處理器或計算機上運行)。

2.Java中的Thread類

(1)Thread類通過實現Runnable接口

(2)線程池(ThreadPool)用來管理線程的數量

我們先用一個例子實現:

  • 創建并啟動100個線程,每個線程都往同一個賬戶添加一元。
  • 定義一個名為Account類模擬賬戶,一個名為AddAYuanTask的類用來向賬戶里添加一元。

程序如下

第一版Account
import?java.util.concurrent.*;
public?class?AccountWithoutSync?{
????private?static?Account?account?=?new?Account();
????public?static?void?main(String[]?args)
????{
????????ExecutorService?executor?=?Executors.newCachedThreadPool();
????????for(int?i?=?0;?i?<?100;?i++)
????????{
????????????executor.execute(new?AddOneYuanTask());
????????}
????????executor.shutdown();?
????????while(!executor.isTerminated())
????????{?????
????????}?
????????System.out.println("What?is?balance??"?+?account.getBalance());
????}
????
????//Inner?class
????private?static?class?AddOneYuanTask?implements?Runnable
????{
????????public?void?run()
????????{
????????????account.deposit(1);
????????}
????}
????
????private?static?class?Account
????{
????????private?int?balance?=?0;
????????
????????public?int?getBalance()
????????{
????????????return?balance;
????????}
????????
????????public?void?deposit(int?amount)
????????{
????????????int?newBalance?=?balance?+?amount;
????????????
????????????????????????//人為地制造延時??
????????????try
????????????{
????????????????Thread.sleep(5);
????????????}
????????????catch(InterruptedException?ex)
????????????{
????????????}
????????????
????????????balance?=?newBalance;
????????}
????}
}

我們運行一下發現balance為4或5,這是個錯誤的結果,如果一個類的對象在多線程程序中導致競爭狀態,則稱這個類為線程不安全的。所以這個任務是線程不安全的。

3.用同步完善程序

用互斥鎖來實現同步,即在一任務開始執行時加鎖,執行完畢后釋放鎖。在釋放鎖之前其它任務無法執行。同步完全可以避免競爭狀態的產生,但有的時候還需要線程之間的相互合作。

然后增加一個向賬戶提款(Withdraw)的任務,當余額小于取款數時,等待新存入的存款。

Account類添加

privatestaticLocklock=newReentrantLock();//創建一個鎖

privatestaticConditionnewDeposit=lock.newCondition();//實現一個條件

Account類中應用互斥鎖的的方法如下

withdraw和deposit

然后程序相應的修改修改

?第二版Account
????public?static?void?main(String[]?args)
????{
????????System.out.println("Thread?1\t\tThread?2\t\tBalance");
????????
????????ExecutorService?executor?=?Executors.newFixedThreadPool(2);
????????executor.execute(new?DepositTask());
????????executor.execute(new?WithdrawTask());
????????executor.shutdown();
????}
????
????
????public?static?class?DepositTask?implements?Runnable
????{
????????public?void?run()
????????{
????????????try
????????????{
????????????????while(true)
????????????????{
????????????????????account.deposit((int)(Math.random()?*?10)?+?1);
????????????????????Thread.sleep(1000);
????????????????}
????????????}
????????????catch(InterruptedException?ex)
????????????{
????????????????ex.printStackTrace();
????????????}
????????}
????}
????
????public?static?class?WithdrawTask?implements?Runnable
????{
????????public?void?run()
????????{
????????????while(true)
????????????{
????????????????account.withdraw((int)(Math.random()?*?10)?+?1);
????????????}
????????}
????}

4.客戶端/服務器的網絡應用

Java中對socket的使用十分方便,在建立socket連接后就可以使用輸入輸出流的方法實現數據傳輸了。

在實現基本的GUI后,在服務器用一個判斷條件永遠為true的循環來監聽客戶端的連接請求(Socketsocket=serverSocket.accept();

服務器通過創建一個內部類(HandleAClient),把客服端的socket傳遞過來執行。

HandleAClient類
????class?HandleAClient?implements?Runnable
????{
????????//A?connected?socket
????????private?Socket?socket;
????????
????????/**Construct?a?thread?*/
????????public?HandleAClient(Socket?socket)
????????{
????????????this.socket?=?socket;
????????}
????????
????????/**Run?a?thread?*/
????????public?void?run()
????????{
????????????try
????????????{
????????????????//Create?data?input?and?output?streams
????????????????DataInputStream?inputFromClient?=?new?DataInputStream(
????????????????????????socket.getInputStream());
????????????????DataOutputStream?outputToClient?=?new?DataOutputStream(
????????????????????????socket.getOutputStream());
????????????????int?order?=?0;
????????????????double?amount;
????????????????//Continuously?serve?the?client
????????????????while(order?!=?4)
????????????????{
????????????????????//Receive?order,?amount?from?the?client
????????????????????order?=?inputFromClient.readInt();
????????????????????amount?=?inputFromClient.readDouble();
????????????????????
????????????????????if(order?==?1)
????????????????????{
????????????????????????outputToClient.writeDouble(account.getBalance());
????????????????????}
????????????????????else?if(order?==?2)
????????????????????{
????????????????????????account.withdraw(amount);
????????????????????????outputToClient.writeDouble(account.getBalance());
????????????????????}
????????????????????else?if(order?==?3)
????????????????????{
????????????????????????account.deposit(amount);
????????????????????????outputToClient.writeDouble(account.getBalance());
????????????????????}
????????????????????
????????????????????jta.append("Order?received?from?client:?"+
????????????????????????????order?+?'\n');
????????????????????jta.append("Balance?is?"?+?account.getBalance()?+?'\n');
????????????????}
????????????}
????????????catch(IOException?e)
????????????{
????????????????System.err.println(e);
????????????}
????????}
????}

而客戶端連接上服務器后,創建兩個IO流

? //IOstreams
? ? DataOutputStreamtoServer=newDataOutputStream(socket.getOutputStream());
? ? DataInputStreamfromServer=newDataInputStream(socket.getInputStream());
? ? 即可傳輸order(菜單選項)和amount
? ? //Sendtheorder,amounttotheserver
? ? toServer.writeInt(order);
? ? toServer.writeDouble(amount);
? ? toServer.flush();
? ? 最后再讀取balance
? ? balance=fromServer.readDouble();

以上就是動力節點java培訓機構的小編針對“Java實戰教程,實現網絡之并發編程”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 一级特黄aa大片一又好看 | 亚洲一区在线播放 | 午夜动态| 丝袜视频在线 | 欧美一级免费 | 欧美亚洲性色影视在线 | 丁香婷婷综合五月综合色啪 | 欧美成人aⅴ | 欧美成在线播放 | 亚洲影视网 | 亚洲精品黄色 | 一区在线观看 | 92精品国产自产在线观看48 | 性色综合 | 亚洲欧美精品成人久久91 | 一级做a爰片久久毛片人呢 一级做a爰片久久毛片免费看 | 中国黄色一级视频 | 日韩在线二区 | 成人短视频在线观看 | 91桃色国产线观看免费 | 久操短视频 | 日韩免费观看视频 | 色综久久天天综合绕视看 | 国产黄色片网站 | 欧美一级高清片免费一级 | 欧美亚洲日本在线 | 中文字幕日韩欧美一区二区三区 | 精品色 | 第九色激情 | 国产精品久久久久久网站 | 麻豆国内精品久久久久久 | 一级免费黄色毛片 | 亚洲欧美日韩综合二区三区 | 大桥未久aⅴ一区二区 | 97视频在线免费 | 额去鲁97在线观看视频 | 西西人体大胆77777视频 | 国产欧美日韩一区二区三区 | 青草免费视频 | 91香蕉国产线观看免 | 日本一区二区三区高清福利视频 |