- 1. JAVA開(kāi)發(fā)工具(集成圖形開(kāi)發(fā)環(huán)境和多線程調(diào)試器) V3...
- 2. 手機(jī)人人 (for Java校內(nèi)通手機(jī)客戶端) 官方安裝版
- 3. Java反編譯工具
- 4. 模擬器運(yùn)行需要JAVA虛擬機(jī)(手機(jī)軟件下載)
- 5. Seurat|基于Java的圖像處理工具 1.0.1
- 6. Sun Java SE Runtime Environment (JRE) for 6 Upda
- 7. Javascript混淆加密器1.2破解版
- 8. Sothink JavaScript Web Scroller (網(wǎng)頁(yè)卷動(dòng)條)V2....
- 9. eclipse java編譯器 中文免費(fèi)版
多線程開(kāi)發(fā)的捷徑:構(gòu)建Java并發(fā)模型框架
14. try {
15. wait();
16. }catch (InterruptedException e) {
17. e.printStackTrace();
18. }
19. }
20.
21. _queue.push(mr);
22. notifyAll();
23. System.out.println("Leave Queue");
24. }
25. public synchronized MethodRequest dequeue() {
26. MethodRequest mr;
27.
28. while(_queue.empty()) {
29. try {
30. wait();
31. }catch (InterruptedException e) {
32. e.printStackTrace();
33. }
34. }
35. mr = (MethodRequest)_queue.pop();
36. notifyAll();
37.
38. return mr;
39. }
40. private Stack _queue;
41. private final static int QUEUE_SIZE = 20;
42.}
43.//ActiveObject的定義
44.class ActiveObject extends Thread
45.{
46. public ActiveObject() {
47. _queue = new ActiveQueue();
48. start();
49. }
50. public void enqueue(MethodRequest mr) {
51. _queue.enqueue(mr);
52. }
53. public void run() {
54. while(true) {
55. MethodRequest mr = _queue.dequeue();
56. mr.call();
57. }
58. }
59. private ActiveQueue _queue;
60.}
通過(guò)上面的代碼可以看出正是這些類(lèi)相互合作完成了對(duì)并發(fā)邏輯的封裝。開(kāi)發(fā)者只需要根據(jù)需要實(shí)現(xiàn)MethodRequest接口,另外再定義一個(gè)服務(wù)代理類(lèi)提供給使用者,在服務(wù)代理者類(lèi)中把服務(wù)調(diào)用者的請(qǐng)求轉(zhuǎn)化為MethodRequest實(shí)現(xiàn),交給活動(dòng)對(duì)象即可。
使用該框架,可以較好的做到應(yīng)用邏輯和并發(fā)模型的分離,從而使開(kāi)發(fā)者集中精力于應(yīng)用領(lǐng)域,然后平滑的和并發(fā)模型結(jié)合起來(lái),并且可以針對(duì)ActiveQueue定制排隊(duì)機(jī)制,比如基于優(yōu)先級(jí)等。
基于框架的解決方案
本小節(jié)將使用上述的框架重新實(shí)現(xiàn)前面的例子,提供對(duì)于并發(fā)的支持。第一步先完成對(duì)于MethodRequest的實(shí)現(xiàn),對(duì)于我們的例子來(lái)說(shuō)實(shí)現(xiàn)如下:
1.class SayHello implements MethodRequest
2.{
3. public SayHello(Service s) {
4. _service = s;
5. }
6. public void call() {
7. _service.sayHello();
8. }
9. private Service _service;
10.}
該類(lèi)完成了對(duì)于服務(wù)提供接口sayHello方法的封裝。接下來(lái)定義一個(gè)服務(wù)代理類(lèi),來(lái)完成請(qǐng)求的封裝、排隊(duì)功能,當(dāng)然為了做到對(duì)Client透明,該類(lèi)必須實(shí)現(xiàn)Service接口。定義如下:
11.class ServiceProxy implements Service
12.{
13. public ServiceProxy() {
14. _service = new ServiceImp();
15. _active_object = new ActiveObject();
16. }
17.
18. public void sayHello() {
19. MethodRequest mr = new SayHello(_service);
20. _active_object.enqueue(mr);
21. }
22. private Service _service;
23. private ActiveObject _active_object;
24.}
其他的類(lèi)和接口定義不變,下面對(duì)比一下并發(fā)邏輯增加前后的服務(wù)調(diào)用的變化,并發(fā)邏輯增加前,對(duì)于sayHello服務(wù)的調(diào)用方法:
25.Service s = new ServiceImp();
26.Client c = new Client(s);
27.c.requestService();
并發(fā)邏輯增加后,對(duì)于sayHello服務(wù)的調(diào)用方法:
28.Service s = new ServiceProxy();
29.Client c = new Client(s);
30.c.requestService();
可以看出并發(fā)邏輯增加前后對(duì)于Client的ServiceImp都無(wú)需作任何改變,使用方式也非常一致,ServiceImp也能夠獨(dú)立的進(jìn)行重用。類(lèi)結(jié)構(gòu)圖如下:
- 1. 多線程開(kāi)發(fā)的捷徑:構(gòu)建Java并發(fā)模型框架
- 2. Java包導(dǎo)入機(jī)制的研究與解析
- 3. JAVA中的main函數(shù)詳細(xì)講解
- 4. Java繼承和接口的區(qū)別
- 5. Java Eclipse反編譯配置
- 6. Java schedule與scheduleAtFixRate區(qū)別
- 7. Java控制臺(tái)打印九九乘法表
- 8. 通過(guò)JNI實(shí)現(xiàn)Java和C++的相互調(diào)用
- 9. Java中Json格式數(shù)據(jù)的應(yīng)用
- 10. Java回調(diào)函數(shù)