Java-java blockingqueue 多线程操作顺序执行问题

发布于 2017-03-16 04:39:04 字数 1032 浏览 1661 评论 2

在多线程环境下 多个线程操作同一个blockingqueue 能不能做到按顺序从队列里取出元素呢?
目前下面这样处理使用多个线程获取队列中的数显示出的顺序是乱的
如果这样无法实现多个线程按顺序操作队列的话那这个是不是就不能作为异步数据库操作的队列了?
因为很可能需要连续处理的两个数据库操作执行顺序是颠倒的
第一次接多线程和队列,希望各位来指点指点

class WriteThread implements Runnable {
static BlockingQueue<Integer> numQueue;
static {
int queuesize = 100;
numQueue = new LinkedBlockingQueue<Integer>(queuesize);
for (int i = 0; i < queuesize; i++) {
numQueue.offer(i);
}
}

public WriteThread() {
}

@Override
public void run() {
try {
while (true) {
Integer num;
num = numQueue.take();
if (null == num)
break;
System.out.println(num);
}
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜无邪 2017-10-17 07:38:48

取肯定是按顺序取的,这是由队列的结构决定的。顺序乱了是因为多线程竞争导致的。如果你要多线程按顺序打印,那为何又要用多线程,直接用单线程不就行了吗?

晚风撩人 2017-06-23 04:28:44

取肯定是按顺序取的,但是执行的时候多个线程一起执行无法保证执行的顺序,你应该是希望队列里的部分任务是按照顺序执行的,那你可以创建两个队列,一个队列只让一个线程执行,另一个队列让多个线程执行,这样需要保证按顺序执行的任务只要放在只有一个线程执行的队列中就可以了,其他不需要保证顺序的任务放在多个线程执行的队列中。

如果你的需求是同一个用户的操作,或对同一个表的操作需要按顺序执行,那你可以创建多个队列,每个队列用一个线程执行队列中的任务,然后按照用户的id或是表名的hashcode对总列表数取模,放入对应的列表中。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文