疑似Google多线程面试题的Java实现 (三)

2014-11-24 07:29:04 · 作者: · 浏览: 1

181. private int theLatestNum;
182.
183. /** 优先级因子,值越大优先级越低 */
184. private int priorityFactor = 0;
185.
186. public MockOutput(int capacity, String name, String path) throws IOException {
187. this.stringBuilder = new StringBuilder(capacity);
188. this.name = name;
189. this.printWriter = new PrintWriter(new FileWriter(path + name + ".txt"));
190. }
191.
192. public int getTheLatestNum() {
193. return theLatestNum;
194. }
195.
196. public void setTheLatestNum(int theLatestNum) {
197. this.theLatestNum = theLatestNum;
198. }
199.
200. public int getPriorityFactor() {
201. return priorityFactor;
202. }
203.
204. /**
205. * 递增优先级因子的值,降低写入优先级
206. */
207. private void reducePriority() {
208. priorityFactor++;
209. }
210.
211. /**
212. * 写入操作
213. *
214. * @param i
215. * @return
216. */
217. public MockOutput append(int i) {
218. stringBuilder.append(i);
219. printWriter.print(i);
220. reducePriority();
221. return this;
222. }
223.
224. /**
225. * 关闭文本输出
226. */
227. public void close() {
228. printWriter.close();
229. }
230.
231. public String toString() {
232. return name + ": " + stringBuilder.toString();
233. }
234. }
235.
236. /**
237. * 用于平衡写入优先级的比较器
238. *
239. * @author: yanxuxin
240. * @date: 2010-2-24
241. */
242. private class PriorityComparator implements Comparator {
243.
244. @Override
245. public int compare(MockOutput o1, MockOutput o2) {
246. int pf1 = o1.getPriorityFactor();
247. int pf2 = o2.getPriorityFactor();
248. return pf1 - pf2;
249. }
250.
251. }
252.
253. }

这个实现中,虚拟文件对象MockOutput的theLatestNum属性记录每个实例最后一次写入的值,由于每个线程仅仅写入一个固定的值,所以一旦得到文件最后一次写入的值就可以判断此文件是否符合线程写入的条件。另外起初我仅仅是使用StringBuilder记录写入的值,PrintWriter是重构时加入的,所以两者都保留了。WriteWorker既是写入线程,其循环检测共享协调对象MultiThreadWriter的working的最新值是否为true,从而调用MultiThreadWriter的writeToOutput(int)去写文件。最初的版本并没有PriorityComparator这个比较器也保证了程序的正常工作。但是输出的结果形如:
A:1234123412341234...
B:23412341234...
C:341234...
D:4123...
之所以出现这样的不协调的结果是因为我使用List存储MockOutput是有序的,所以取值时如果排在前面的和排在后面的均满足写入的话,显然排名靠前的抢了被写入的机会,贫富差距拉大。不过现实虽然我改变不了,程序我还是能主宰的。所以重构时我加入了PriorityComparator这个比较器,在每次写入完毕时调用adjustPriority()使用比较器把机会少的调整到前面均衡一下,这样最终写入的几率基本上能相差无几。

这个实现其实基本上就是API的堆砌,没有什么自我实现的算法,如果以后有好的思路我会再次重构的。如果写程序能不用考虑吃饭,生活该多好啊...新的一年祝愿Developers诸事顺利,我也要好好地准备一下了。为了兴趣,为了生活,Wish I Can...

摘自 code dream