Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 - Fatal编程技术网

Java 暂停方法,直到再次调用它

Java 暂停方法,直到再次调用它,java,multithreading,Java,Multithreading,我有一个方法run(),它执行许多其他方法。在这些子方法中,在某些子方法中,有一个计数器以1递增。当此计数器达到给定的数值n时,方法run()应暂停一段不确定的时间。当它再次被调用时,它应该在暂停之前从它离开的地方开始执行 这在Java中可能吗 编辑:Andersoj询问的更多信息 我曾多次尝试删除我的代码。这是一个非常基本的例子 public void run(int n) { executeA(); } public void executeA() { while (rando

我有一个方法
run()
,它执行许多其他方法。在这些子方法中,在某些子方法中,有一个计数器以1递增。当此计数器达到给定的数值
n
时,方法
run()
应暂停一段不确定的时间。当它再次被调用时,它应该在暂停之前从它离开的地方开始执行

这在Java中可能吗

编辑:Andersoj询问的更多信息

我曾多次尝试删除我的代码。这是一个非常基本的例子

public void run(int n) {
   executeA();
}

public void executeA() {
   while (randomCondition) {
      executeB();
      counter++;
   }
   executeC();
   if (counter <= 100)
      executeD();
}
公共作废运行(int n){
executeA();
}
公共无效执行器a(){
while(随机条件){
executeB();
计数器++;
}
executeC();

if(counter如果您的停止和恢复基于给定的条件,并假设该方法将被其他线程唤醒,从而可能导致条件更改(您的问题中没有一个前提是明确的):

或者,您可以使用
mutex.wait(waitTime)
等待任意时间

当条件发生变化时,您的另一个线程将唤醒正在等待的线程,或者它将在等待时间结束后再次唤醒,在这种情况下,条件将被重新评估,如果条件没有发生变化,它可能再次进入等待状态

public void run() {
   synchronized(mutex){
     if(condition){
         mutex.notify();
     }
   }
}

如果您的停止和恢复基于给定的条件,并假设该方法将被其他线程唤醒,从而可能导致条件更改(您的问题中没有明确的前提):

或者,您可以使用
mutex.wait(waitTime)
等待任意时间

当条件发生变化时,您的另一个线程将唤醒正在等待的线程,或者它将在等待时间结束后再次唤醒,在这种情况下,条件将被重新评估,如果条件没有发生变化,它可能再次进入等待状态

public void run() {
   synchronized(mutex){
     if(condition){
         mutex.notify();
     }
   }
}


这听起来像是一个线程问题,这是一个正确的假设吗?@GregFlynn,我曾经考虑过线程,但是当
运行()时
方法已暂停,其他方法应该仍然可以执行。我认为没有线程是不可能的,因为您正在描述一个上下文切换。这听起来像是最好用任务和执行者来表示的东西。也许您可以提出一些(骨架?)代码和条件…@andersoj,我添加了一个非常基本的代码框架这听起来像是一个线程问题,这是一个正确的假设吗?@GregFlynn,我考虑过线程化,但是当
运行()时
方法已暂停,其他方法应该仍然可以执行。我认为没有线程是不可能的,因为您正在描述一个上下文切换。这听起来像是最好用任务和执行者来表示的东西。也许您可以提出一些(骨架?)代码和条件…@andersoj,我添加了一个非常基本的代码框架。条件决定线程何时暂停。另一个
run()
调用应该启动线程again@gieldl你能详细解释一下你的陈述吗?不确定你所说的“重新开始线程”指的是什么,在Java中无法重新启动线程。如果您指的是恢复执行给定线程,则在该线程收到第二段代码中所示的通知之前,不会发生这种情况。请再次返回。是的,我的意思是恢复执行在
run()中启动的线程
@gieldl让我换一句话,你有两个线程
t1
t2
。当
t1
达到条件时,它将等待任意时间。你的线程
t2
执行并改变使
t1
暂停的原始条件。现在
t2
可以通知
t1
或忽略通知n并让
t1
消耗其等待时间。当
t2
唤醒时(通过
t2
通知或消耗其等待时间)它重新测试该条件,如果它已经改变,它将恢复执行,否则,它将再次进入等待模式,并且再次以任意的时间量进入。@ GIDEL可以考虑通过条件确定何时暂停该线程。
应启动线程again@gieldl你能详细解释一下你的陈述吗?不确定你所说的“重新开始线程”指的是什么,在Java中无法重新启动线程。如果您指的是恢复执行给定线程,则在该线程收到第二段代码中所示的通知之前,不会发生这种情况。请再次返回。是的,我的意思是恢复执行在
run()中启动的线程
@gieldl让我换一句话,你有两个线程
t1
t2
。当
t1
达到条件时,它将等待任意时间。你的线程
t2
执行并改变使
t1
暂停的原始条件。现在
t2
可以通知
t1
或忽略通知n并让
t1
消耗其等待时间。当
t2
唤醒时(通过
t2
通知或消耗其等待时间)它重新测试该条件,如果它已经改变,它将恢复执行,否则,它将再次进入等待模式,并且再次以任意的时间量进入。