大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線(xiàn):400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java實(shí)戰(zhàn)教程,實(shí)現(xiàn)網(wǎng)絡(luò)之并發(fā)編程

Java實(shí)戰(zhàn)教程,實(shí)現(xiàn)網(wǎng)絡(luò)之并發(fā)編程

更新時(shí)間:2020-05-12 16:14:42 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2372次

1.并發(fā)與并行

個(gè)人理解并發(fā)就是在時(shí)間上運(yùn)行程序(即不同任務(wù)在不同時(shí)間片上運(yùn)行),并行就是在空間上運(yùn)行程序(即不同任務(wù)在不同處理器或計(jì)算機(jī)上運(yùn)行)。

2.Java中的Thread類(lèi)

(1)Thread類(lèi)通過(guò)實(shí)現(xiàn)Runnable接口

(2)線(xiàn)程池(ThreadPool)用來(lái)管理線(xiàn)程的數(shù)量

我們先用一個(gè)例子實(shí)現(xiàn):

  • 創(chuàng)建并啟動(dòng)100個(gè)線(xiàn)程,每個(gè)線(xiàn)程都往同一個(gè)賬戶(hù)添加一元。
  • 定義一個(gè)名為Account類(lèi)模擬賬戶(hù),一個(gè)名為AddAYuanTask的類(lèi)用來(lái)向賬戶(hù)里添加一元。

程序如下

第一版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;
????????????
????????????????????????//人為地制造延時(shí)??
????????????try
????????????{
????????????????Thread.sleep(5);
????????????}
????????????catch(InterruptedException?ex)
????????????{
????????????}
????????????
????????????balance?=?newBalance;
????????}
????}
}

我們運(yùn)行一下發(fā)現(xiàn)balance為4或5,這是個(gè)錯(cuò)誤的結(jié)果,如果一個(gè)類(lèi)的對(duì)象在多線(xiàn)程程序中導(dǎo)致競(jìng)爭(zhēng)狀態(tài),則稱(chēng)這個(gè)類(lèi)為線(xiàn)程不安全的。所以這個(gè)任務(wù)是線(xiàn)程不安全的。

3.用同步完善程序

用互斥鎖來(lái)實(shí)現(xiàn)同步,即在一任務(wù)開(kāi)始執(zhí)行時(shí)加鎖,執(zhí)行完畢后釋放鎖。在釋放鎖之前其它任務(wù)無(wú)法執(zhí)行。同步完全可以避免競(jìng)爭(zhēng)狀態(tài)的產(chǎn)生,但有的時(shí)候還需要線(xiàn)程之間的相互合作。

然后增加一個(gè)向賬戶(hù)提款(Withdraw)的任務(wù),當(dāng)余額小于取款數(shù)時(shí),等待新存入的存款。

Account類(lèi)添加

privatestaticLocklock=newReentrantLock();//創(chuàng)建一個(gè)鎖

privatestaticConditionnewDeposit=lock.newCondition();//實(shí)現(xiàn)一個(gè)條件

Account類(lèi)中應(yīng)用互斥鎖的的方法如下

withdraw和deposit

然后程序相應(yīng)的修改修改

?第二版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.客戶(hù)端/服務(wù)器的網(wǎng)絡(luò)應(yīng)用

Java中對(duì)socket的使用十分方便,在建立socket連接后就可以使用輸入輸出流的方法實(shí)現(xiàn)數(shù)據(jù)傳輸了。

在實(shí)現(xiàn)基本的GUI后,在服務(wù)器用一個(gè)判斷條件永遠(yuǎn)為true的循環(huán)來(lái)監(jiān)聽(tīng)客戶(hù)端的連接請(qǐng)求(Socketsocket=serverSocket.accept();

服務(wù)器通過(guò)創(chuàng)建一個(gè)內(nèi)部類(lèi)(HandleAClient),把客服端的socket傳遞過(guò)來(lái)執(zhí)行。

HandleAClient類(lèi)
????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);
????????????}
????????}
????}

而客戶(hù)端連接上服務(wù)器后,創(chuàng)建兩個(gè)IO流

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

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java實(shí)戰(zhàn)教程,實(shí)現(xiàn)網(wǎng)絡(luò)之并發(fā)編程”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-04-24 搶座中
  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 性孕妇video国产中国 | 欧美成人一区二区三区不卡 | 亚洲精品久久九九热 | 国产一级大片免费看 | 美国一级毛片片aa成人 | 欧美艹逼视频 | 中文字幕在线精品视频万部 | 四虎成人在线视频 | 欧美理论在线观看 | 色婷婷影视 | 精品久久久久久久久久中文字幕 | 欧美日韩视频在线成人 | 久久精品男人的天堂 | 国产一级毛片夜一级毛片 | 一区二区免费播放 | 国产欧美一区二区精品性色 | 精品视频一区二区三三区四区 | 亚洲综合色站 | 亚洲一二三 | 91激情视频 | 天天翘夜夜洗澡天天做 | 一级片按摩 | 久久福利在线 | 国内精品久久久久丫网址 | 国产精品一区二区资源 | 亚洲国产系列久久精品99人人 | 欧美视频一区在线 | 亚洲国产精品67194成人 | 久久国产乱子伦精品免费不卡 | 婷婷精品 | 亚洲不卡视频在线 | 四虎国产精品影库永久免费 | 国产亚洲欧美ai在线看片 | 91啦丨国产丨 | 国产高清美女一级a毛片久久 | 亚洲视频在线观看 | 夜夜操美女 | 亚洲成人网在线 | 国产在线精品福利91香蕉 | 国产亚洲欧美一区二区 | 13一14周岁毛片免费 |