码迷,mamicode.com
首页 > 编程语言 > 详细

多线程程序设计学习(5)balking模式和timed模式

时间:2015-07-18 21:19:34      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

Balking【返回模式】
一:balking pattern的参与者
--->GuardedObject(被警戒的对象)

--->该模式的角色:模拟修改警戒对象的线程,当警戒条件达到执行具体操作的线程,参与者(被警戒的参与者)
       

二:balking pattern模式什么时候使用
--->不需要刻意去执行什么操作的时候(比如说自动保存)
--->不想等待警戒条件成立时。(不让线程休息)
--->警戒条件只有第一次成立时候。
   

三:balking pattern思考
--->balking pattern (返回模式)和Guarded suspension pattern(等待唤醒模式)的中间
        3.1Guarded suspension当警戒条件不成立时,会等待,直到成立,并被唤醒。
        3.2balking 当警戒条件不成立,退出。
        3.3两种极端的处理方式之间还有一种折衷的做法。在条件成立为止之前,等待一段时间,看看条件是否成立,如果不成立,则balk。这种方式称之为guarded timed 或简单称之为timeOut
---->线程类中的各个唤醒方法
        3.1:当notify方法执行时==>如果wait set里有多条线程,只有一条被唤醒
        3.2:当notifyAll方法执行时==>wait set里有多少条线程都被唤醒。
        3.3:interrupt方法执行时==>wait set里的线程会(与调用notify,notifyAll一样)重新尝试获取锁定。
                                                       ==> notify,notifyAll是对实例调用的,而interrupt是对线程调用的。关于中断,后续会提到。
        3.4:发生timeout时,由于wait(超时时间),和被notify或notifyAll唤醒重新尝试获取锁定,分不清楚,所以timeout需要程序员自己写。

Balking【返回模式】案例:模拟自动保存文件,当文件没有更改时,每隔一秒的自动保存数据,真正保存操作不执行。如果有修改,则执行真正保存操作。

数据类

技术分享
 1 package com.yeepay.sxf.thread4;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 /**
 8  * 数据类。
 9  * @author sxf
10  *
11  */
12 public class Data {
13     //文件名
14     private String fileName;
15     //文件内容
16     private String content;
17     //表示是否被修改过
18     private boolean flag;
19     //构造器
20     public Data(String fileName, String content) {
21         super();
22         this.fileName = fileName;
23         this.content = content;
24         this.flag=true;
25         File file =new File(fileName);
26         try {
27             file.createNewFile();
28             FileOutputStream iFileOutputStream=new FileOutputStream(file);
29             iFileOutputStream.write(content.getBytes());
30         } catch (IOException e) {
31             // TODO Auto-generated catch block
32             e.printStackTrace();
33         }
34     }
35     //修改内容
36     public synchronized void channgeContent(String newContent){
37         this.content=newContent ;
38         flag=true;
39     }
40     
41     //把新的数据写入文件
42     private void save() throws IOException{
43         System.out.println("Data.save()"+Thread.currentThread().getName()+"执行写入操作,写入的内容为:"+content);
44         FileOutputStream fileWriter=new FileOutputStream(new File(fileName));
45         fileWriter.write(content.getBytes());
46     }
47     
48     //保存内容
49     public synchronized void saveNewContent(){
50         if(!flag){
51             System.out.println("Data.saveNewContent(试图新保存,但没有更改)");
52             return;
53         }
54         try {
55             save();
56             System.out.println("Data.saveNewContent(新内容保存成功)");
57             flag=false;
58         } catch (IOException e) {
59             e.printStackTrace();
60         }
61     }
62 }
View Code

模拟修改数据的线程

技术分享
 1 package com.yeepay.sxf.thread4;
 2 /**
 3  * 模拟自动修改线程
 4  * @author sxf
 5  *
 6  */
 7 public class ChangeThread implements Runnable{
 8     private Data data;
 9 
10     public ChangeThread(Data data) {
11         super();
12         this.data = data;
13     }
14 
15     @Override
16     public void run() {
17         for(int i=0;i<20;i++){
18             //修改内容
19             System.out.println("ChangeThread.run()"+Thread.currentThread().getName()+"第"+i+"次修改");
20             data.channgeContent("新内容"+i);
21             //线程休息10秒
22             try {
23                 Thread.sleep(10000L);
24             } catch (InterruptedException e) {
25                 // TODO Auto-generated catch block
26                 e.printStackTrace();
27             }
28         }
29     }
30 
31     
32 }
View Code

模拟自动保存的线程

技术分享
 1 package com.yeepay.sxf.thread4;
 2 /**
 3  * 自动保存的线程
 4  * @author sxf
 5  *
 6  */
 7 public class ZiDongSaveThread implements Runnable{
 8     private Data data;
 9 
10     
11     public ZiDongSaveThread(Data data){
12         this.data=data;
13     }
14     @Override
15     public void run() {
16         while(true){
17             //保存数据
18             data.saveNewContent();
19             //线程休息1秒,意味着每隔一妙钟自动保存一次文件
20             try {
21                 Thread.sleep(1000L);
22             } catch (InterruptedException e) {
23                 // TODO Auto-generated catch block
24                 e.printStackTrace();
25             }
26         }
27         
28     }
29     
30 }
View Code

测试类

技术分享
 1 package com.yeepay.sxf.thread4;
 2 /**
 3  * 测试类
 4  * @author sxf
 5  *
 6  */
 7 public class Test {
 8     
 9     
10 public static void main(String[] args) {
11     //声明内容
12     Data data=new Data("/usr/war/hsl.txt", "老黄买了新手机");
13     //声明自动保存线程
14     Thread saveThread=new Thread(new ZiDongSaveThread(data));
15     saveThread.setName("自动保存线程");
16     //声明模拟修改线程
17     Thread chaThread=new Thread(new ChangeThread(data));
18     chaThread.setName("模拟修改线程");
19     
20     //启动线程
21     saveThread.start();
22     chaThread.start();
23     
24     
25 }
26 }
View Code

 打印结果

Data.save()自动保存线程执行写入操作,写入的内容为:老黄买了新手机
Data.saveNewContent(新内容保存成功)
ChangeThread.run()模拟修改线程第0次修改
Data.save()自动保存线程执行写入操作,写入的内容为:新内容0
Data.saveNewContent(新内容保存成功)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
ChangeThread.run()模拟修改线程第1次修改
Data.save()自动保存线程执行写入操作,写入的内容为:新内容1
Data.saveNewContent(新内容保存成功)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)
Data.saveNewContent(试图新保存,但没有更改)

多线程程序设计学习(5)balking模式和timed模式

标签:

原文地址:http://www.cnblogs.com/shangxiaofei/p/4657516.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!