多线程有序执行的方法!!参考 https://blog.csdn.net/Jae_Wang/article/details/80399730
多线程和线程池的总结以及常见的面试问题:https://blog.csdn.net/tianmi1988/article/details/51334299
1.测试用例
@Test
public void testthread() throws InterruptedException {
List<String> list = new ArrayList<>();
list.clear();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
list.add("yura");
System.out.println("list"+list);
}
});
t1.start();
// t1.join();
list.clear();
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
list.add("yura");
System.out.println("list"+list);
}
});
t2.start();
//t2.join();
}
输出结果:list[yura] list[yura,yura]
注意:list.clear()方法不论写在线程里还是外,都会出现数据重复添加的问题,此测试用例过于简单,无法重现list.clear()方法写在线程里出现重复添加的现象,项目中出现过
2.每次启动后添加join即可解决 :输出结果list[yura] list[yura]
(但是要注意性能影响,一般不推荐使用)
3.使用线程池:
@Test
public void testthread() throws InterruptedException {
List<String> list = new ArrayList<>();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
list.clear();
list.add("yura");
System.out.println("list"+list);
}
});
// t1.start();
// t1.join();
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
list.clear();
list.add("yura");
System.out.println("list"+list);
}
});
// t2.start();
// t2.join();
ExecutorService exec = Executors.newSingleThreadExecutor(); //创建一个单线程化的线程池
exec.submit(t1);
exec.submit(t2);
exec.shutdown();// 关闭线程池
}
输出结果:list[yura] list[yura]
注意:使用线程池的时候list.clear()需要写在线程里面
4.扩展:线程池的好处和应用 https://blog.csdn.net/qq_38729449/article/details/79452898