【发布时间】:2017-02-27 20:49:14
【问题描述】:
我有一个异步记录眼动数据的类。有方法可以start 和stop 记录过程。数据收集在一个集合中,并且只有在记录线程完成其工作时才能访问该集合。它基本上封装了所有线程和同步,因此我的库的用户不必这样做。
大大缩短的代码(省略了泛型和错误处理):
public class Recorder {
private Collection accumulatorCollection;
private Thread recordingThread;
private class RecordingRunnable implements Runnable {
...
public void run() {
while(!Thread.currentThread().isInterrupted()) {
// fetch data and collect it in the accumulator
synchronized(acc) { acc.add(Eyetracker.getData()) }
}
}
}
public void start() {
accumulatorCollection = new Collection();
recordingThread = new Thread(new RecordingRunnable(accumulatorCollection));
recordingThread.start();
}
public void stop() {
recordingThread.interrupt();
}
public void getData() {
try {
recordingThread.join(2000);
if(recordingThread.isAlive()) { throw Exception(); }
}
catch(InterruptedException e) { ... }
synchronized(accumulatorCollection) { return accumulatorCollection; }
}
}
用法很简单:
recorder.start();
...
recorder.stop();
Collection data = recorder.getData();
我对整个事情的问题是如何测试它。目前我正在这样做:
recorder.start();
Thread.sleep(50);
recorder.stop();
Collection data = recorder.getData();
assert(stuff);
这可行,但它是不确定的,并且会大大降低测试套件的速度(我将这些测试标记为集成测试,因此它们必须单独运行以规避此问题)。
有没有更好的办法?
【问题讨论】:
-
您是否在睡觉以便收集数据,或确保进程已启动?
-
我这样做是为了收集数据,否则我只会得到一个数据包左右。
-
看起来您正在重新发明Future,您可以通过submitting a task to an ExecutorService 获得。
标签: java multithreading unit-testing asynchronous