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 爪哇:为什么不';t线程终止_Java_Multithreading - Fatal编程技术网

Java 爪哇:为什么不';t线程终止

Java 爪哇:为什么不';t线程终止,java,multithreading,Java,Multithreading,我不明白为什么我的简单程序中的线程总是无法终止。 我认为这是一个容易的问题,但我不明白为什么。我认为一个简单的exec.shutdown();应该关闭线程池而不使用try-and-catch for exec.shutdownNow();但我不确定 类1:测试(实现运行线程池的类) 类2:ExecServicerunnen(实现一个线程池,其中MyTask()为Runnables) 第3类:myTask(正在运行等待一段时间) 程序总是无法终止 死锁 x.runningThreads()在x.g

我不明白为什么我的简单程序中的线程总是无法终止。 我认为这是一个容易的问题,但我不明白为什么。我认为一个简单的exec.shutdown();应该关闭线程池而不使用try-and-catch for exec.shutdownNow();但我不确定

类1:测试(实现运行线程池的类)

类2:ExecServicerunnen(实现一个线程池,其中MyTask()为Runnables)

第3类:myTask(正在运行等待一段时间)

程序总是无法终止

死锁

x.runningThreads()
x.getThreadtoStop()之前不返回,但是
x.getThreadtoStop()仅在
x.runningThreads()之后调用返回。瞧,线程永远不会停止

错误在于,
runningThreads()
在主线程内同步运行,而不是在自己的线程中。在等待信号终止时,主线程无法向自身发送终止信号

在不太改变代码结构的情况下,您可以使用另一个线程解决此问题,如:

public class ExecServicrunnen implements Runnable {

  private volatile boolean solange = true;

  // Rename runningThreads() to run():
  @Override
  public void run() {
    // The former code of runningThreads() here...
  }

}
-

顺便说一下,在大多数情况下,布尔
solange
逻辑应该通过和来实现。

死锁

x.runningThreads()
x.getThreadtoStop()之前不返回,但是
x.getThreadtoStop()仅在
x.runningThreads()之后调用返回。瞧,线程永远不会停止

错误在于,
runningThreads()
在主线程内同步运行,而不是在自己的线程中。在等待信号终止时,主线程无法向自身发送终止信号

在不太改变代码结构的情况下,您可以使用另一个线程解决此问题,如:

public class ExecServicrunnen implements Runnable {

  private volatile boolean solange = true;

  // Rename runningThreads() to run():
  @Override
  public void run() {
    // The former code of runningThreads() here...
  }

}
-


顺便说一句,在大多数情况下,布尔
solange
逻辑应该通过和来实现。

ah现在它确实编译了,为了更好地阅读,我更改了x处的方法名称,但忘记了更改对象本身的方法名称。尽管线程问题仍然存在。啊,现在它确实编译了,为了更好地阅读,我在x处更改了方法的名称,但忘记了更改对象本身中的方法名称。不过线程问题仍然存在。我如何避免这种情况?因为每当我在一个线程(main方法)中启动两个对象时,它都会同步执行。我可以在getThreadtoStop()中调用一个return或break,并将其放在runningThreads()之前,在那里等待计数器或将在ExecServicerunnen中初始化的任何东西,但我想有更好的解决方案。我如何避免这种情况?因为每当我在一个线程(main方法)中启动两个对象时,它都会同步执行。我可以在getThreadtoStop()中调用return或break,并将其放在runningThreads()之前,在那里等待计数器或任何将在ExecServicerunnen中初始化的内容,但我想有更好的解决方案。
public class myTask implements Runnable{

public void run() {

// doSomething

try {
    Thread.sleep(10000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}
public class ExecServicrunnen implements Runnable {

  private volatile boolean solange = true;

  // Rename runningThreads() to run():
  @Override
  public void run() {
    // The former code of runningThreads() here...
  }

}
public class test {


  public static void main(String[] args) throws InterruptedException{

    ExecServicrunnen x = new ExecServicrunnen();

    // Have ExecServicrunnen run in its own thread:
    new Thread( x ).start();

    Thread.sleep(10000);

    x.getThreadtoStop();

  }

}