Java 为什么这个线程在这种情况下不停止?
我启动了一个新的线程,将照片从手机上传到电脑网络服务器Java 为什么这个线程在这种情况下不停止?,java,multithreading,java-me,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
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;
}
那么,为什么我必须转到主屏幕才能停止线程?可能是因为
transferphotos()
没有完成,可能是因为等待从未到达的字节的IO读取?如果是这样,那么线程将永远保持活动状态,或者直到被中断(正如您所做的那样)
顺便说一句,我看不到当前线程的任何测试值:
if (Thread.currentThread() == thrdTrsfr) // Huh?
如果您的代码(通过使用
activeCount()
)在以下操作之后立即检查线程计数:
thrdTrsfr.interrupt();
thrdTrsfr = null;
thrdTrsfr.interrupt();
thrdTrsfr.join();
thrdTrsfr = null;
在这种情况下,当调用activeCount()
时,线程可能尚未终止
尝试在interrupt()
调用之后添加join()
调用。然后,当调用activeCount()
时,您就可以确定线程真的死了
因此,将上述代码替换为以下代码:
thrdTrsfr.interrupt();
thrdTrsfr = null;
thrdTrsfr.interrupt();
thrdTrsfr.join();
thrdTrsfr = null;
调用
Thread.interrupt()
不会终止线程。这更像是礼貌地询问线程是否可以立即停止
- 如果线程使用
进行检查,则可以看到它已被中断thread.isInterrupted()
- 如果线程处于
或睡眠
调用中,调用将以等待
终止中断异常
- 在某些情况下,执行IO操作的线程可能会以
终止调用。(我一直无法弄清楚这是否真的发生在现代JVM上,或者这是否只是一个遗留的例外…)中断异常
就你而言:
中断()
- 您的应用程序(或某些库)正在捕获并忽略中断,或者
- 存在争用条件,您正在测试线程是否在有机会处理中断之前就已死亡