本文實例講述了Java多線程模式之Balking模式。分享給大家供大家參考,具體如下:
當現在不適合這個操作,或是沒有必要進行這個操作時就直接放棄這個操作而回去。這個就是Balking模式
例如王某在餐廳吃飯,當王某需要點餐時喊服務員需要點餐。當服務員A和B都注意到了王某點餐的示意,這時服務員B看到服務員A已經去響應了王某的點餐請求,所以服務員B就不會再過去響應王某的點餐請求。
程序示例:
程序的需求是模擬一個自動保存的功能。自動保存是為了預防計算機忽然斷電或則軟件突然出錯的危險,定期將數據保存在文件里的功能。
1、Data類:表示是否修改,及修改函數的類
2、SaveThread類:定期保存
3、ChangeThread:修改數據,保存文件
4、Main:模擬數據
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package org.zhy.demo04; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; /** * 表示是否修改,及修改函數的類 * @author zhengyi * */ public class Data { private final String fileName; //文件名稱 private String content; //修改內容 private boolean changed; //是否可以修改 //構造函數 public Data(String fileName,String content){ this .fileName=fileName; this .content=content; } /** * 新的修改內容 如果有新的需要保存的數據,changed的屬性修改為true * 注:這個方法是用synchronized修飾的 * 為了保護content與changed屬性用 * synchronized修飾后就只能同時有 * 1個線程訪問也就防止了多線程造成的臟數據 * @param newContent */ public synchronized void change(String newContent){ content=newContent; changed= true ; } /** * 保存 */ public synchronized void save(){ if (!changed){ //當changed值為false時直接return出去 return ; } else { doSave(); //調用保存方法 changed= false ; //保存后changed的值修改為false } } /** * 具體的修改方法,模擬寫到文本中。 */ private void doSave(){ System.out.println( "線程名稱:" +Thread.currentThread().getName()+ ",最新需要保存的值=" +content); try { Writer writer= new FileWriter(fileName); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package org.zhy.demo04; /** * 定期保存的類 * @author zhengyi * */ public class SaveThread extends Thread{ private Data data; public SaveThread(String name,Data data){ super (name); //線程名稱 this .data=data; } public void run(){ try { while ( true ){ data.save(); //模擬保存方法 Thread.sleep( 1000 ); //休息1秒 } } catch (Exception e) { e.printStackTrace(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package org.zhy.demo04; import java.util.Random; /** * 修改數據,保存文件的類 * @author zhengyi * */ public class ChangeThread extends Thread{ private Data data; private Random random= new Random(); public ChangeThread(String name,Data data){ super (name); //線程名稱 this .data=data; } public void run(){ try { for ( int i= 0 ; true ;i++){ data.change( "No:" +i); //模擬的數據 Thread.sleep(random.nextInt( 1000 )); //模擬去做別的事情 data.save(); //明確的要求要保存 } } catch (Exception e) { e.printStackTrace(); } } } |
1
2
3
4
5
6
7
8
|
package org.zhy.demo04; public class Main { public static void main(String[] args) { Data data= new Data( "data.txt" , "我是默認內容" ); //文件的名稱及文件的默認內容 new ChangeThread( "ChangeThread" , data).start(); //手動保存 new SaveThread( "SaveThread" , data).start(); //自動保存 } } |
運行結果:
什么時候使用Balking模式?
1、不需要刻意去執行的時候
2、不想等待警戒條件時
3、警戒條件只有一次成立時
希望本文所述對大家java程序設計有所幫助。