Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个线程在这种情况下不停止?_Java_Multithreading_Java Me - Fatal编程技术网

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上,或者这是否只是一个遗留的例外…)

如果上述任何一种情况都没有发生,中断的线程将继续运行,就像什么都没有发生一样


就你而言:

  • 中断()
  • 您的应用程序(或某些库)正在捕获并忽略中断,或者
  • 存在争用条件,您正在测试线程是否在有机会处理中断之前就已死亡

即使我添加了join()方法(并且捕获了InterruptedException),线程也不会停止:我无法执行其他操作,例如删除手机内存储的照片:我收到了IOException。虽然当我没有启动上传线程,然后我可以成功地删除照片。那么在上传照片之后,我应该怎么做才能删除照片呢?如果join()返回,那么线程将停止。若activeCount()仍然显示额外的线程,那个么问题出在其他地方。methdod调用transferphotos()是否创建第二个线程?我使用java j2me,但不使用java j2se。因此方法isInterrupted()在j2me中不可用。该方法可用,但它不会像您假设的那样停止线程。停止线程的最佳方法是让Runnable从其run方法返回。如果需要从另一个线程启动终止,可以在Runnable中添加类似“boolean terminationRequested”的字段,并从另一个线程将其设置为true。然后确保定期检查该字段并在其为真时从run方法返回。如何从run方法返回?@Andy Frédéric-与从任何方法调用返回的方式相同。是的,有一个InputStream打开而不是关闭!