网易首页 > 网易号 > 正文 申请入驻

同步多线程集成测试的五种方式

0
分享至

几周前,我写了一篇关于同步多线程集成测试的博客,该博客在DZone Javalobby上重新发布,从那里收到了 Robert Saulnier 的评论,他非常正确地指出你也可以使用 join() 来同步工作线程及其单元测试。这让我想到,你可以通过多少种方式来同步多线程集成测试?于是,我开始数...并想出了:


使用随机延迟。
添加 CountDownLatch

Thread.join()

获取信号量
带有 Future 和 ExecutorService
现在,我不打算详细解释以下所有内容,我会让代码自己说话,只是说所有代码示例都做了大致相同的事情:单元测试创建一个 ThreadWrapper 实例,然后调用它的 doWork() 方法(或在 Future 的情况下为 call() )。然后单元测试的主线程等待工作线程完成,然后断言测试已通过。
对于演示第 1 点和第 2 点的示例代码,请查看我关于同步多线程集成测试的原始博客,但我不推荐第 1 点:使用随机延迟。
public class ThreadWrapper {
private Thread thread;
/**
* Start the thread running so that it does some work.
*/
public void doWork() {
thread = new Thread() {
/**
* Run method adding data to a fictitious database
*/
@Override
public void run() {
System.out.println("Start of the thread");
addDataToDB();
System.out.println("End of the thread method");
}
private void addDataToDB() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
System.out.println("Off and running...");
}
/**
* Synchronization method.
*/
public void join() {
try {
thread.join();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
public class ThreadWrapperTest {
@Test
public void testDoWork() throws InterruptedException {
ThreadWrapper instance = new ThreadWrapper();
instance.doWork();
instance.join();
boolean result = getResultFromDatabase();
assertTrue(result);
}
/**
* Dummy database method - just return true
*/
private boolean getResultFromDatabase() {
return true;
}
}

获取信号量


public class ThreadWrapper {
/**
* Start the thread running so that it does some work.
*/
public void doWork() {
doWork(null);
}
@VisibleForTesting
void doWork(final Semaphore semaphore) {
Thread thread = new Thread() {
/**
* Run method adding data to a fictitious database
*/
@Override
public void run() {
System.out.println("Start of the thread");
addDataToDB();
System.out.println("End of the thread method");
semaphore.release();
}
private void addDataToDB() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
aquire(semaphore);
thread.start();
System.out.println("Off and running...");
}
private void aquire(Semaphore semaphore) {
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public class ThreadWrapperTest {
@Test
public void testDoWork() throws InterruptedException {
ThreadWrapper instance = new ThreadWrapper();
Semaphore semaphore = new Semaphore(1);
instance.doWork(semaphore);
semaphore.acquire();
boolean result = getResultFromDatabase();
assertTrue(result);
}
/**
* Dummy database method - just return true
*/
private boolean getResultFromDatabase() {
return true;
}
}

With a Future

public class ThreadWrapper implements Callable {
@Override
public Boolean call() throws Exception {
System.out.println("Start of the thread");
Boolean added = addDataToDB();
System.out.println("End of the thread method");
return added;
}
/**
* Add to the DB and return true if added okay
*/
private Boolean addDataToDB() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return Boolean.valueOf(true);
}
}
public class ThreadWrapperTest {
@Test
public void testCall() throws ExecutionException, InterruptedException {
ThreadWrapper instance = new ThreadWrapper();
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future future = executorService.submit(instance);
Boolean result = future.get();
assertTrue(result);
}
}

在列出了所有这些方法之后,接下来要考虑的是哪一种是最好的?在问这个问题的时候,你必须用“最好”来定义“最好”这个词,为了什么?最简单的方法?可维护性?速度还是代码大小?毕竟编程是做出正确决定的艺术。您可能已经猜到,我不喜欢随机延迟的想法,更喜欢使用 CountDownLatch。Join ()有点老派; 请记住,Semaphore 和 CountDownLatch 之类的代码是为了改进原来的 Java 线程技术而编写的。ExecutorService 对于我们这里需要的东西来说似乎有点沉重。归根结底,技巧的选择实际上取决于个人的喜好。

最后,我列出了同步多线程集成测试的五种方法; 但是,如果您能想到其他方法,请让我知道..。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
没穿几次,碎得惨不忍睹!上海女子反映买到adidas“陈年老鞋”,售出时已经“压箱”4年多,客服称“库存信息属店铺隐私无法提供”

没穿几次,碎得惨不忍睹!上海女子反映买到adidas“陈年老鞋”,售出时已经“压箱”4年多,客服称“库存信息属店铺隐私无法提供”

大风新闻
2026-05-31 21:31:07
《关于进一步深化国资国企改革的方案(2026—2029年)》已经下发

《关于进一步深化国资国企改革的方案(2026—2029年)》已经下发

澎湃新闻
2026-05-31 18:44:26
泽连斯基做梦没料到,先等来的不是俄军打基辅,中方突然划下红线

泽连斯基做梦没料到,先等来的不是俄军打基辅,中方突然划下红线

李健政观察
2026-05-29 16:38:02
有人正偷偷“篡改”抗战历史!他们想毁掉的,不只是30万人的记忆

有人正偷偷“篡改”抗战历史!他们想毁掉的,不只是30万人的记忆

浪子说
2026-05-30 00:05:05
超级电容异军突起,这8家储能企业被低估了

超级电容异军突起,这8家储能企业被低估了

慧眼看世界哈哈
2026-05-31 12:31:08
马斯克生育论:狂言背后的现实思辨

马斯克生育论:狂言背后的现实思辨

风铃草语
2026-05-31 06:28:52
苹果新款Beats头戴耳机曝光 巴萨小将亚马尔率先佩戴

苹果新款Beats头戴耳机曝光 巴萨小将亚马尔率先佩戴

CNMO科技
2026-05-31 12:06:28
3-0夺赛点!上海男篮打崩广厦,朱芳雨一针见血的点评全说中

3-0夺赛点!上海男篮打崩广厦,朱芳雨一针见血的点评全说中

去山野间追风
2026-06-01 01:35:19
1-0大冷!中国男足以小打大赢了,等了整整7年,短短15天双杀沙特

1-0大冷!中国男足以小打大赢了,等了整整7年,短短15天双杀沙特

侃球熊弟
2026-05-31 23:03:13
林建岳再卖资产套现,4.5亿出售百年游艇公司,买家被曝是刘强东

林建岳再卖资产套现,4.5亿出售百年游艇公司,买家被曝是刘强东

八斗小先生
2026-05-31 16:41:16
背叛中国、出卖孟晚舟凶手现形后,如今遭到了哪些报应?

背叛中国、出卖孟晚舟凶手现形后,如今遭到了哪些报应?

混沌录
2026-05-30 23:51:06
巴西稀土加工中心开张,CEO说:专供欧美,不接中国订单

巴西稀土加工中心开张,CEO说:专供欧美,不接中国订单

我是一个粉刷匠2
2026-05-31 03:34:58
2026上半年口碑最好10部国产剧:《主角》第3,第1实至名归

2026上半年口碑最好10部国产剧:《主角》第3,第1实至名归

八斗小先生
2026-05-30 19:06:12
NBA抽签改制,第4到10名获最高概率,摆烂时代终结?

NBA抽签改制,第4到10名获最高概率,摆烂时代终结?

体育硬核说
2026-06-01 02:17:43
女生办健康证性生活却被印在上面,内容太辣眼!医院态度让人气愤

女生办健康证性生活却被印在上面,内容太辣眼!医院态度让人气愤

小鋭有话说
2026-05-31 14:57:47
历史不会重演,但会惊人相似:中国楼市极大可能重走2015年老路?

历史不会重演,但会惊人相似:中国楼市极大可能重走2015年老路?

专业聊房君
2026-05-29 08:37:43
演员张凌赫工作室道歉:全额补偿交通住宿费!此前粉丝挤爆玻璃门,数人被擦伤送医,线下活动紧急取消

演员张凌赫工作室道歉:全额补偿交通住宿费!此前粉丝挤爆玻璃门,数人被擦伤送医,线下活动紧急取消

新浪财经
2026-05-31 21:09:23
阿斯利姆,遇袭身亡

阿斯利姆,遇袭身亡

极目新闻
2026-05-31 10:30:10
刘大锤爆料黄晓明离婚真相:不是性格不合,只因爱不下去了!

刘大锤爆料黄晓明离婚真相:不是性格不合,只因爱不下去了!

东方不败然多多
2026-05-30 03:54:48
35页PPT疯传:洛阳女子1女谈3男,每天卡时间,都已谈婚论嫁

35页PPT疯传:洛阳女子1女谈3男,每天卡时间,都已谈婚论嫁

烈史
2026-05-30 13:23:41
2026-06-01 03:07:00
牛马科技
牛马科技
业务数码玩家.无聊的博主
6032文章数 615关注度
往期回顾 全部

科技要闻

戴尔诺基亚又回来了!AI重估老牌科技公司

头条要闻

特朗普生日白宫办格斗赛 近距离观赛花超100万美元

头条要闻

特朗普生日白宫办格斗赛 近距离观赛花超100万美元

体育要闻

阿森纳用最悲壮的方式,成就了巴黎王朝

娱乐要闻

朱军退休,正义虽迟但到,女方受惩

财经要闻

医学首席转岗搞科技,A股科技股遭遇巨震

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

教育
健康
时尚
本地
房产

教育要闻

unit2 (第五课时) 上

尝试干细胞疗法如何避免踩坑?

梓渝:慢下来,也很好

本地新闻

用剪纸的方式,打开江苏扬州

房产要闻

红动五月!全国抢入核心资产,广州盯紧凯旋新世界!

无障碍浏览 进入关怀版