1

我有一个作为 Java SwingWorker 运行的 Socket 服务器。

SwingWorker 接收传入的连接,并在连接后将套接字移交给负责连接的 Executor。Executor 调用一个 SocketHandler,它将通过 run() 方法处理套接字。

现在,我在 GUI 上有一个按钮,上面写着停止。当我按下停止按钮时,我想停止 SwingWorker 的执行。为此,我在按下停止按钮时调用了一个 cancel(true) 方法。

现在,尽管我的程序调用了 cancel(true) 方法,SocketHandler 仍继续接收传入数据。这里发生了什么?

我已经阅读了几篇文章,这是 JDK 中的一个错误,即调用 cancel(true) 方法不会停止 SwingWorker。这是真的?

4

3 回答 3

4

只需在循环中添加一个布尔检查器

if (!stillWorking)return;

然后您可以将布尔值设置为 false 以停止该方法。

于 2011-06-08T18:52:43.750 回答
3

用于public final boolean cancel(boolean mayInterruptIfRunning)

" mayInterruptIfRunning-true如果执行此任务的线程应该被中断;否则,允许完成正在进行的任务"。

你必须继续阅读Thread.interrupt。它实际上并没有中断任何事情;您必须在代码中指定如何处理中断。

此外,您的问题还不清楚您是否只是想阻止主SwingWorker服务器进行连接,或者您是否也想终止所有现有连接。

编辑:如果您while在接受连接的线程中有一个循环:

while (!Thread.interrupted()) {

我猜应该足够了。现在当SwingWorker被取消时,循环应该停止,因为SwingWorker线程设置了内部中断标志。

于 2011-06-08T18:56:30.330 回答
2

@Yakult121 请这不是对您的两个问题的回答,当我取消 SwingWorker和Java SwingWorker时,Java SwingWorker 套接字服务器没有被取消- 使用发布/进程更新 EDT 中的 TextArea?,我认为你的问题没有完全描述,我错过了很多重要的细节,

你必须发布更好的代码......,这展示了你对 Executor、SwingWorker 和取消的实现

您的代码也可以基于这两个线程

1/取消 SwingWorker

2/ Executor 和 SwingWorker

3/ 以及如何/如何确定具体 SwingWorker 的取消线程

4/真的把你的两条线放在一起

于 2011-06-08T19:34:17.597 回答