java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1776字,纯文字阅读大概需要3分钟。
内容图文
![java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?](/upload/InfoBanner/zyjiaocheng/674/9fec599c762f4647a2f9c605490bd846.jpg)
我有一个非常简单的服务器(使用kryonet).客户端仅存储汽车的当前状态(x,y,角度等),并发送加速和转弯请求.
服务器正在接收请求,并将它们添加到ArrayBlockingQueue中,物理线程将耗尽该队列并读取和更新.
添加其他玩家时,游戏速度会降低近一倍.我排除了很多事情(我已将所有更新和程序包发送速度限制在60Hz.)
我怀疑使用阻塞队列会阻塞太多,从而导致速度下降.
如何在不阻止问题的情况下将客户端请求发送到物理线程?
解决方法:
I am suspecting that using a blocking queue is blocking so much that it is causing the slowdown.
你怀疑错了.以下测试程序通过ArrayBlockingQueue推送了100万个整数:
public class ArrayBlockingQueuePerfTest {
int maxi = 1000000;
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1000,
true);
Thread sender = new Thread("sender") {
public void run() {
try {
for (int i = 0; i < maxi; i++) {
queue.offer(i, 1, TimeUnit.SECONDS);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
};
};
Thread receiver = new Thread("receiver") {
public void run() {
try {
int count = 0;
long sum = 0;
while (count < maxi) {
sum += queue.poll(1, TimeUnit.SECONDS);
count++;
}
System.out.println("done");
System.out.println("expected sum: " + ((long) maxi) * (maxi - 1) / 2);
System.out.println("actual sum: " + sum);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
};
};
public ArrayBlockingQueuePerfTest() {
sender.start();
receiver.start();
}
public static void main(String[] args) {
new ArrayBlockingQueuePerfTest();
}
}
在我的笔记本电脑上,它会在几秒钟后终止.因此,无论性能瓶颈在哪里,它都不是ArrayBlockingQueue,它可以处理的吞吐量至少比您需要高3个数量级.换句话说,即使您发现根本不需要执行时间的线程通信方法,也只能使程序最多加快0.1%.
总结一下有关此问题以及所有其他性能问题的经验教训:解决现有代码中的任何性能问题时,第一步是测量代码的哪一部分很慢,通常这不是人们期望的.探查器极大地简化了此任务.
内容总结
以上是互联网集市为您收集整理的java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?全部内容,希望文章能够帮你解决java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。