问题描述
我正在为我的多线程代码使用阻塞队列,并且我正在使用这些队列来限制实例数量。
我有一个包含任务逻辑的 Runnable 类。
public class MyRunnable implements Runnable {
private final Data data;
private final LinkedBlockingQueue<ClassA> queue1;
private final LinkedBlockingQueue<ClassB> queue2;
public MyRunnable(final Data data,final LinkedBlockingQueue<ClassA> queue1,final LinkedBlockingQueue<ClassB> queue2) {
this.data = data;
this.queue1 = queue1;
this.queue2 = queue2;
}
@Override
public void run() {
ClassA obj1 = null;
ClassB obj2 = null;
try {
obj1 = queue1.take();
obj2 = queue2.take();
} catch (InterruptedException e) {
}
try {
final ClassC output = obj1.someMethod(data); //throws exceptions
obj2.someMethod(output); //throws exceptions
} catch (final Exception e) {
}
enqueueBoth(obj1,obj2);
}
}
我已经在一个类中声明了 queue1
和 queue2
,并且还添加了一些 ClassA
和 ClassB
的实例。
执行者服务代码:
executorService.execute(new MyRunnable(myData,queue1,queue2));
我正在为它编写单元测试以检查这段代码是否是线程安全的。
我尝试过以下单元测试:
@Mock
private LinkedBlockingQueue<ClassA> queue1;
@Mock
private LinkedBlockingQueue<ClassB> queue2;
@Test
public void run() throws InterruptedException {
Thread thread1 = new Thread(new Runnable() {
@SneakyThrows @Override public void run() {
Data data = Mockito.mock(Data.class);
ClassA obj1 = Mockito.mock(ClassA.class);
ClassB obj2 = Mockito.mock(ClassB.class);
ClassC output = Mockito.mock(ClassC.class);
MyRunnable myRunnable = new MyRunnable(data,queue2);
Mockito.when(queue1.take()).thenReturn(obj1);
Mockito.when(queue2.take()).thenReturn(obj2);
Mockito.when(obj1.someMethod(data)).thenReturn(output);
Mockito.doNothing().when(obj2).someMethod(output);
myRunnable.run();
Mockito.verify(obj1).someMethod(data);
Mockito.verify(obj2).someMethod(output);
}
});
thread1.start();
thread1.join();
}
同样在这个测试中又多了一个线程。
MyRunnable 类线程安全吗?我是否为它编写了正确的单元测试? try catch 会阻塞一个线程中的执行是否会干扰另一个线程的执行。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)