不需要就算了,Balk 即 停止并返回。
我们在并发编程的时候,经常会遇到这样的情况,就是我们并发请求,但是只要一个回应,谁先来就用谁,后来的就扔掉。现实中就是,老师让我们回答问题,问:1+1 等于多少? 然后抢答,你的手速比较慢,小明先回答了:2。虽然你内心极度不甘心,虽然你知道等于 10 但是你没有机会了。
好了,小葵花课堂开课了,我们如何在程序中实现这个呢?其实很简单,用一个 flag 来保存,是否有人抢到。如果有人抢到了就把 flag 置为true。那么后来的自然就不能去响应了。这个就要保证修改 flag 的时候是 synchronized 。
在举个例子,我们平时用的word,会有自动保存的功能。保存线程每隔1秒保存一下,但是如果没有改变是不需要再次保存的。
Data 最关键的就是 changed 这个 flag。change 和 save 都是 synchronized 的方法。保证安全。
public class Data {private String fileName;private String content;private boolean changed;public Data(String fileName, String content) {this.fileName = fileName;this.content = content;}public synchronized void change(String newContent) {this.content = newContent;changed = true;}public synchronized void save() throws IOException {if (changed == true) {doSave();changed = false;} else {System.out.println(Thread.currentThread().getName()+"-- no change");return;}}private void doSave() throws IOException {System.out.println(Thread.currentThread().getName()+"--"+content);Writer writer = new FileWriter(fileName);writer.write(content);writer.close();}}
SaverThread 线程 每一秒保存一下。
public class SaverThread extends Thread {private final Data data;public SaverThread(String name, Data data) {super(name);this.data = data;}@Overridepublic void run() {super.run();try {while (true) {data.save();Thread.sleep(1000);}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}
ChangerThread 线程 不定时写入。
public class ChangerThread extends Thread {private final Data data;private Random random = new Random();public ChangerThread(String name, Data data) {super(name);this.data = data;}@Overridepublic void run() {super.run();Random random = new Random();long num = 0;try {while (true) {String str = "change:" + num++;data.change(str);Thread.sleep(random.nextInt(2000));}} catch (InterruptedException e) {e.printStackTrace();}}}
public class Main {public static void main(String[] args) {Data data = new Data("data.txt", "empty");new ChangerThread("ChangerThread",data).start();new SaverThread("SaverThread",data).start();}}
实行结果如下:

