如何多线程更新同一张表?
比如有10个线程,线程1更新0~100,线程2更新100~200,线程3更新200~300。
我自己写的,发现总有跳过中间的行为,比如200~300没更新,更新到后面去了。
如何保证整个表全部更新过去呢?
这个有什么思路吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
比如有10个线程,线程1更新0~100,线程2更新100~200,线程3更新200~300。
我自己写的,发现总有跳过中间的行为,比如200~300没更新,更新到后面去了。
如何保证整个表全部更新过去呢?
这个有什么思路吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
//数据---我只使用3个线程
ConcurrentSkipListMap<Integer, Integer> map = new ConcurrentSkipListMap<>();
for (int i = 0; i < 300; i++) {
map.put(i+1, i+1);
}
CountDownLatch latch = new CountDownLatch(1); //门闩
new Thread(() ->{
map.forEach((k, v) ->{
if(v <= 100) {
map.put(k, v+1);
System.out.println(Thread.currentThread().getName() + "111111,原始数据 key=" + k + ", value=" + v);
}else {
try {
latch.await(); //阻塞当前线程,直到计数器的值为0
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}, "thread-1").start();
new Thread(() ->{
map.forEach((k, v) ->{
if(v > 100 && v <= 200) {
latch.countDown(); //当前线程调用此方法,则计数减一
map.put(k, v+1);
System.out.println(Thread.currentThread().getName() + "222222,原始数据 key=" + k + ", value=" + v);
}else {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}, "thread-2").start();
new Thread(() ->{
map.forEach((k, v) ->{
if(v > 200) {
latch.countDown(); //当前线程调用此方法,则计数减一
map.put(k, v+1);
System.out.println(Thread.currentThread().getName() + "333333,原始数据 key=" + k + ", value=" + v);
}
});
}, "thread-3").start();
TimeUnit.MILLISECONDS.sleep(2);
map.forEach((k , v) ->{
System.out.println("修改之后的数据 " + k + "," + v);
});
}
}
该方法不一定是最优的,你可以进行更改,也可以只参考
1. 用in语句还是 >200 and <300操作的sql语句
打开数据库日志, 日志里面都有记录
多线程更新表没问题,你首先应该先确认你获取到的数据对不对,你的200-300这个数据如果获取没问题,我相信应该问题也不大
说明 你获取的列表 数据 不固定