【问题标题】:How to implement a multiquestion poll thread in Java for multiple users?如何在 Java 中为多个用户实现多问题轮询线程?
【发布时间】:2013-04-09 09:04:21
【问题描述】:

我有一个关于 Java 线程的问题。这是我的场景:

  • 2 不同的人将在他们的手机中收到多问题民意调查。
  • 发送问题后,服务器会保持等待() 状态,直到收到答案。然后,发送 notify() 信号以继续投票,直到发送完所有问题。
  • 用户 1 可能正在回答 问题 3,而 用户 2 仍在回答 问题 1。

到目前为止,我的方法是实现一个新的 ChainedPollThread 线程。无论如何,通过这种方式,如果 用户 1 回答了问题 1,那么用户 1 和 2 都会收到第二个问题。

我需要为每个用户创建一个新的 ChainedPollThread 吗?

如果用户数量增加,这是否意味着我需要创建(例如)100 个线程?

实现我想要实现的目标的适当方式是什么?

提前致谢。

【问题讨论】:

    标签: java multithreading synchronize


    【解决方案1】:

    多线程的方式是每个参与者都需要一个线程。

    您现在实现这一点的方式意味着,一旦有人回答了一个问题,您的服务器端程序的整个状态就会推进到第二个问题。为每个参与者设置一个线程(因此,如果你愿意的话,一个投票程序)将缓解这个问题。

    要减少由于不必要的线程数量而导致的服务器负载,请使用线程池(请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html)。一旦不再需要现有线程,线程池就会重新使用它们,从而试图将活动线程的大小保持在最低限度。 (创建线程是昂贵的部分)如果需要更多,则池增长到指定的最大值,如果需要更少,则缩小到指定的最小值。

    另一方面,整个模型有一些危险:如果一个人根本不回答怎么办?服务器会超时吗?它会永远等待吗?

    一种选择可能是在移动设备上安装一个软件/框架,它能够接收所有问题和可能的投票答案,并一个接一个地呈现在屏幕上。一旦参与者按下“完成”,一组选择的答案就会发送回给您。这样你的服务器就不需要为每个参与者保留线程,只需接收一个包含所有答案的字符串。

    【讨论】:

    • 感谢西蒙的回答。已经实现了防止死锁的超时,所以没有问题。唯一的问题是我的“手机”并不是真正的手机(我这么说只是为了简化我的问题)。接收问题的设备存储能力非常低,无法处理这么大的数据。我想,线程池或信号量将是我的答案。非常感谢您提供的信息。
    • 啊,信号量,没想到 :)
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多