我开始了一个新的主题,将照片从手机上传到计算机网络服务器。
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;
}
那么为什么我必须进入主屏幕才能让线程停止?
答案 0 :(得分:1)
可能是transfererPhotos()
没有完成,可能是因为等待IO读取的字节永远不会到来?如果是这样,那么线程将永远保持活着,或直到被打断(正如你所做的那样)。
BTW,我看不出当前线程测试的任何值:
if (Thread.currentThread() == thrdTrsfr) // Huh?
答案 1 :(得分:1)
调用Thread.interrupt()
不会杀死一个帖子。这更像是礼貌地询问线程是否现在可以停止。
如果线程检查Thread.isInterrupted()
,则可以看到它已被中断。
如果该话题位于sleep
或wait
来电,则该来电将以InterruptedException
终止。
在某些情况下,执行IO操作的线程可能会以InterruptedIOException
终止呼叫。 (我从来没有弄清楚这是否真的发生在现代JVM上,或者这只是遗留的例外......)
如果上述情况均未发生,则中断的线程将继续运行,就像没有发生任何事情一样。
在你的情况下:
interrupt()
可能没有被注意到(如上所述),答案 2 :(得分:0)
如果您的代码在以下内容之后检查线程数(使用activeCount()
):
thrdTrsfr.interrupt();
thrdTrsfr = null;
在这种情况下,当调用activeCount()
时,线程可能还没有被杀死。
尝试在join()
来电后添加interrupt()
来电。然后,当调用activeCount()
时,您可以确定线程确实已经死了。
所以,用以下内容替换上面的代码:
thrdTrsfr.interrupt();
thrdTrsfr.join();
thrdTrsfr = null;