word自动保存功能,如果文档被修改了,后台线程每隔一段时间会自动执行保存功能,但是如果用户在自动保存之前用Ctrl+S手动保存呢?自动保存还会执行吗?答案是不会,因为这个操作时不需要重复做的。
public
class
BalkingTest {
public
static
void
main(String[] args) {
Data data =
new
Data(
"data.txt"
,
"(empty)"
);
new
ChangerThread(
"ChangerThread"
, data).start();
new
AutoSaverThread(
"AutoSaverThread"
, data).start();
}
}
class
ChangerThread extends Thread{
private
Data data;
private
Random random =
new
Random();
public
ChangerThread(String name, Data data){
super(name);
this
.data=data;
}
@Override
public
void
run() {
try
{
for
(
int
i=0;
true
; i++){
data.change(
"No."
+ i);
Thread.sleep(random.nextInt(1000));
data.save();
}
}
catch
(IOException e){
e.printStackTrace();
}
catch
(InterruptedException e){
e.printStackTrace();
}
}
}
class
AutoSaverThread extends Thread{
private
Data data;
public
AutoSaverThread(String name, Data data){
super(name);
this
.data=data;
}
@Override
public
void
run() {
try
{
while
(
true
){
data.save();
Thread.sleep(3000);
}
}
catch
(IOException e){
e.printStackTrace();
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
class
Data{
private
final String filename;
private
String content;
private
boolean changed;
public
Data(String filename, String content){
this
.filename=filename;
this
.content=content;
this
.changed =
true
;
}
public
synchronized
void
change(String newContent){
this
.content = newContent;
this
.changed=
true
;
}
public
synchronized
void
save() throws IOException{
if
(!changed){
return
;
}
doSave();
changed=
false
;
}
private
void
doSave() throws IOException {
System.err.println(Thread.currentThread().getName()+
" call doSave(), content = "
+ content);
Writer writer =
new
FileWriter(filename);
writer.write(content);
writer.close();
}
}
|
这样就不会重复保存了,执行结果如下:
AutoSaverThread call doSave(), content = No.0
ChangerThread call doSave(), content = No.1
ChangerThread call doSave(), content = No.2
ChangerThread call doSave(), content = No.3
ChangerThread call doSave(), content = No.4
AutoSaverThread call doSave(), content = No.5
ChangerThread call doSave(), content = No.6
ChangerThread call doSave(), content = No.7
ChangerThread call doSave(), content = No.8
ChangerThread call doSave(), content = No.9
ChangerThread call doSave(), content = No.10
AutoSaverThread call doSave(), content = No.11
ChangerThread call doSave(), content = No.12
ChangerThread call doSave(), content = No.13
ChangerThread call doSave(), content = No.14
ChangerThread call doSave(), content = No.15
AutoSaverThread call doSave(), content = No.16
|
还有一种情况,就是一个类的一个方法只想被执行一次,我们可以用Balking 模式处理。
class
RunOnceTime{
private
boolean initialized =
false
;
public
synchronized
void
init(){
if
(initialized ==
true
){
return
;
}
doInit();
initialized =
true
;
}
private
void
doInit(){
}
}
|