为什么这个线程在这种情况下不会停止?

时间:2011-09-05 06:43:51

标签: java multithreading java-me

我开始了一个新的主题,将照片从手机上传到计算机网络服务器。

if (CMenu.retCommand == transferer)
{
     thrdTrsfr = new Thread(this);
     thrdTrsfr.start();
}

public void run() {
        if (Thread.currentThread() == thrdTrsfr)
        {
            if (vButtonPhotos.size() > 0)
                transfererPhotos("http://192.168.1.123/imfmobile/photoj2meupload/uploadphoto.php");
            else
                afficheAlert("Aucune photo à transférer !");
        }
    }

上传完成后我停止了线程。我在上传之前测试了活动线程的数量。当我在停止上传线程后测试正在运行的线程数时,该数字不会改变。我必须导航回主屏幕,然后在上传之前活动线程的数量是相同的。我使用此代码来停止上传线程:

if (thrdTrsfr != null && thrdTrsfr.isAlive())
{
    thrdTrsfr.interrupt();
    thrdTrsfr = null;
}

那么为什么我必须进入主屏幕才能让线程停止?

3 个答案:

答案 0 :(得分:1)

可能是transfererPhotos()没有完成,可能是因为等待IO读取的字节永远不会到来?如果是这样,那么线程将永远保持活着,或直到被打断(正如你所做的那样)。

BTW,我看不出当前线程测试的任何值:

if (Thread.currentThread() == thrdTrsfr) // Huh?

答案 1 :(得分:1)

调用Thread.interrupt()不会杀死一个帖子。这更像是礼貌地询问线程是否现在可以停止。

  • 如果线程检查Thread.isInterrupted(),则可以看到它已被中断。

  • 如果该话题位于sleepwait来电,则该来电将以InterruptedException终止。

  • 在某些情况下,执行IO操作的线程可能会InterruptedIOException终止呼叫。 (我从来没有弄清楚这是否真的发生在现代JVM上,或者这只是遗留的例外......)

如果上述情况均未发生,则中断的线程将继续运行,就像没有发生任何事情一样。


在你的情况下:

  • interrupt()可能没有被注意到(如上所述),
  • 您的应用程序(或某些库)正在捕捉并忽略中断,或
  • 存在竞争条件,您正在测试线程是否已经有机会处理中断之前已经死亡。

答案 2 :(得分:0)

如果您的代码在以下内容之后检查线程数(使用activeCount()):

thrdTrsfr.interrupt();
thrdTrsfr = null;

在这种情况下,当调用activeCount()时,线程可能还没有被杀死。

尝试在join()来电后添​​加interrupt()来电。然后,当调用activeCount()时,您可以确定线程确实已经死了。

所以,用以下内容替换上面的代码:

thrdTrsfr.interrupt();
thrdTrsfr.join();
thrdTrsfr = null;