時間),只需要領個提貨單就可以了(去幹別的事情),等到蛋糕做好了,再拿提貨單取蛋糕就可以了。
package
com.
somnus
.async
;
/**
*
* @description: 顧客
* @date 2023年3月9日 下午7:20:41
* @version 1.0
*/
public
class
customer
catch
(interruptedexceptione)
system
.out
.println
("main otherjob end"
);
system
.out
.println
("cake1 = "
+cake1
.getcake
());
system
.out
.println
("cake2 = "
+cake2
.getcake
());
system
.out
.println
("cake3 = "
+cake3
.getcake
());
system
.out
.println
("main end"
);
}
}
這裡的customer
類就相當於「顧客」,cakeshop
就相當於「蛋糕店」,顧客向「蛋糕店」定蛋糕就相當於「發請求request」,返回的資料cake
是deliveryorder
的例項,就相當於提貨單,而不是真正的「蛋糕」。在過一段時間後(sleep一段時間後),呼叫data1.getcontent()
,也就是拿提貨單獲取執行結果。
下面來看一下,顧客定蛋糕後,蛋糕店做了什麼:
package
com.
somnus
.async
;/**
* @description: todo
* @date 2023年3月9日 下午7:21:32
* @version 1.0
*/public
class
cakeshop
}.start
();system
.out
.println
("request("
+count
+", "+c
+") end"
);// (3) 取回futuredata實體,作為傳回值
return
order;}
}cakeshop
(「蛋糕店」)在接到請求後,先生成了「提貨單」deliveryorder
的例項order
,然後命令「蛋糕師傅cakebaker
去做蛋糕,cakebaker
相當於起個執行緒去做蛋糕了。然後host返回給顧客的僅僅是「提貨單」future,而不是蛋糕。當蛋糕做好後,蛋糕師傅才能給對應的「提貨單」蛋糕,也就是order.setcakebaker(cakebaker)
;。
下面來看看蛋糕師傅是怎麼做蛋糕的:
建立乙個字串,包含count個c字元,為了表現出犯法需要花費一些時間,使用了sleep。
package
com.
somnus
.async
;
public
inte***ce
cake
package
com.
somnus
.async
;/**
* @description: 蛋糕師傅
* @date 2023年3月9日 下午7:22:52
* @version 1.0
*/public
class
cakebaker
implements
cake
catch
(interruptedexceptione)
}system
.out
.println
("****** cake("
+count
+", "+c
+") end"
);this
.cake
=new
string
(buffer);}
public
string
getcake()}
現在來看看「提貨單」order是怎麼與蛋糕」cake」對應的:
package
com.
somnus
.async
;
/**
* @description: 提貨單
* @date 2023年3月9日 下午7:25:06
* @version 1.0
*/
public
class
deliveryorder
implements
cake
this
.cakebaker
=cakebaker
;
this
.ready
=true
;
notifyall
();
}
public
synchronized
string
getcake
()catch
(interruptedexceptione)
}
return
cakebaker
.getcake
();
}
}
顧客做完自己的事情後,會拿著自己的「提貨單」來取蛋糕:
system
.out
.println
("cake1 = "
+cake1
.getcake
());
這時候如果蛋糕沒做好,就只好等了:
while
(!ready
)catch
(interruptedexceptione)
}
//等做好後才能取到
return
cakebaker
.getcake
();程式分析
對於每個請求,host都會生成乙個執行緒,這個執行緒負責生成顧客需要的「蛋糕」。在等待一段時間以後,如果蛋糕還沒有做好,顧客還必須等待。直到「蛋糕被做好」,也就是
order.setcakebaker(cakebaker);
執行以後,顧客才能拿走蛋糕。
每個執行緒只是專門負責製作特定顧客所需要的「蛋糕」。也就是顧客a對應著蛋糕師傅a,顧客b對應著蛋糕師傅b。即使顧客b的蛋糕被先做好了,顧客a也只能等待蛋糕師傅a把蛋糕做好。換句話說,顧客之間沒有競爭關係。
類deliveryorder
的兩個方法被設定為synchronized
,實際上蛋糕師傅a與顧客a之間的互斥關係,也就是顧客a必須等待蛋糕師傅a把蛋糕做好後,才能拿走,而與蛋糕師傅b是否做好了蛋糕沒有關係。
非同步呼叫和多執行緒呼叫
同步方法和非同步方法的區別 同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果 非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作 現在新建乙個windows應用程式,然後放上乙個button1,寫入以下 c code private void button...
java 非同步呼叫
業務要求流程流轉與資料記錄 插表 非同步進行 使用執行緒池實現非同步呼叫 1.執行緒池配置 name esg.taskexecutor class org.springframework.scheduling.concurrent.threadpooltaskexecutor name corepo...
java非同步呼叫理解
下面來看看蛋糕師傅是怎麼做蛋糕的 建立乙個字串,包含count個c字元,為了表現出犯法需要花費一些時間,使用了sleep。public class realdata implements data catch interruptedexception e system.out.println rea...