gpt4 book ai didi

java - 老C++程序员,Java新手,需要Java多线程和事件方面的帮助

转载 作者:行者123 更新时间:2023-11-30 11:36:16 27 4
gpt4 key购买 nike

我正在将一个使用串行端口的 C++ 程序(更准确地说是 Borland“组件”)“转换”为 Java。该程序使用一个线程来监听串行端口,并在收到给定的“事件字符”之一(可能是回车、ACK、NACK ...)或用户定义的数量时引发事件收到字符。

在尝试将其转换为 Java 时,我了解了一些有关线程的知识,使其半工作。我仍然需要了解如何将事件从监听线程引发到主线程...然后我了解了 Executors 的存在,这似乎是正确的方法,因为用户可以关闭、重新打开或更改端口多次并每次都创建一个新线程似乎是一种不好的做法。

因此,在 Java 并发海洋中苦苦挣扎数天之前,在“原始”线程上花费了大量工作之后,我会寻求建议,也许还有一些示例。

我应该使用什么样的对象(我看到有各种各样的执行器)来拥有一个串行监听器:

  • 能够向主线程抛出一个事件来传递接收到的字符数组
  • 可以暂停和重新启动(并且可以在暂停时指向不同的输入流...我的意思是我可以在暂停时调用它的一些方法)
  • 它会在不需要时销毁(用户可以选择使用套接字代替,因此不再需要监听器)

?我真的不知道其中一些点是否取决于我要选择的对象,所以我将它们全部列出来只是为了避免下次重新做所有事情,因为我不清楚。

谢谢。

最佳答案

如果你有一些主线程必须从其他线程接收事件(很像服务器套接字),一些blocking queue可能是一个解决方案。主线程可以在循环中调用 takeLast - 这将暂停它直到任何其他线程调用 putFirst,为同一队列提供一个值。 (SynchronousQueue 将暂停提供线程,直到主线程准备就绪,或者 ArrayBlockingQueue 支持给定大小的队列)。

有了这样的设置,主线程不能同时是一个 GUI 线程。使用 invokeAndWait如果您需要从中触摸标签或按钮等界面组件。

 final BlockingQueue q = new ArrayBlockingQueue(3); 

new Thread() {
public void run() {
while (have_some_messages()) {
q.putFirst("Hey!");
}
}
}.start();

new Thread() {
public void run() {
while (also_have_some_messages()) {
q.putFirst("Boo!");
}
}
}.start();

// Main thread will print both Hey and Boo:
while (must_keep_running()) {
Object serveIt = q.takeLast();
System.out.println(serveIt);
}

如果主线程是 Swing 线程(您说的是带有 Swing 控件的 JFrame),请在其中添加一个按钮以启动服务线程:

Runnable service = new Runnable() {
public void run() {
try {
while (must_keep_running()) {
Object serveIt = q.takeLast();
System.out.println(serveIt);
}
} finally {
// Re-enable the start button when the service thread exits:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
bStart.setEnabled(true);
}
});
};
}
};

JButton bStart = new JButton("Start ..");
bStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(service).start();
bStart.setEnabled(false);
}
}
});

关于java - 老C++程序员,Java新手,需要Java多线程和事件方面的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602676/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com