所以,我想最好从我正在规划的应用程序的用例开始。
我计划创建一个音频播放器,本地网络中的每个人都可以通过网页上传音乐并为特定歌曲投票。然后播放和可视化得票最多的歌曲。还应该可以通过 Web 界面播放和暂停当前歌曲。
所以我的解决方案是编写两个应用程序;第一个是播放器,它应该播放歌曲并可视化它们,并从数据库中获取下一首歌曲。另一部分是 servlet,它处理文件上传到播放器以及 ID3 标签的处理以及最终插入到数据库中。
目前为止,一切都好。现在,我需要一种方法来快速传达播放/暂停事件以及更改可视化效果的可能事件。我想出了多种解决方案:
- 将 Java Message Services 与 Apache ActiveMQ 配合使用前端和可视化之间的事件。(应该是可能与消息侦听器,所以响应会很快,但是需要Apache ActiveMQ作为附加技术(
- 将此类命令写入表中,并让玩家使用每半秒左右的线程(缺点:可能看起来滞后,因为间隔低,也会在服务器 PC/覆盆子上产生负载圆周率(
- 插座
有没有更好的方法来解决这种沟通,因为所有这些解决方案似乎都不理想?
我想最好的方法是使用通过等待和通知机制实现的线程,其中歌曲播放器将等待来自servlet的响应,一旦servlet收到响应,它就会通知玩家播放歌曲。
此线程将充当 servlet 和歌曲播放器之间的桥梁。
我创建了此示例程序来演示流程。在这里,您可以假设线程A作为歌曲播放器,ThreadB作为投票应用程序,然后继续。在发送通知呼叫之前编写业务逻辑。
package com.WaitNotify;
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();
b.start();
synchronized (b) {
try {
System.out.println("Waiting for b to complete");
b.wait();
} catch (InterruptedException e) {
}
System.out.println("total is " + b.getTotal());
}
}
}
class ThreadB extends Thread {
private int total = 0;
public void run() {
synchronized (this) {
for (int i = 0; i < 100; i++) {
this.total += 1;
}
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Operationcompleted-- Going to notify");
notify();
}
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}