编程语言
首页 > 编程语言> > java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?

java-如何在不使用阻塞队列的情况下将消息传递给另一个线程?

作者:互联网

我有一个非常简单的服务器(使用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%.

总结一下有关此问题以及所有其他性能问题的经验教训:解决现有代码中的任何性能问题时,第一步是测量代码的哪一部分很慢,通常这不是人们期望的.探查器极大地简化了此任务.

标签:concurrency,box2d,slowdown,kryo,java
来源: https://codeday.me/bug/20191102/1988269.html