Balking【返回模式】timed【超时模式】
一: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需要程序员自己写。

---->sleep和wait的区别有:
  1,这两个方法来自不同的类分别是Thread和Object
  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
   5.wait被唤醒后,重新获取锁,从阻塞的代码处继续往下执行。和sleep一样。

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

相关文章: