暂停线程在java中是否可以自由地执行其他事情并在特定时间后继续?
我想通过按下一个按钮使一个线程在GUI中暂停,该线程可以使用或释放,直到单击相同的按钮,这在java中是可能的。有什么想法吗?我正在使用Swing GUI您可以通过不在其中执行任何操作来模拟暂停 要进行模拟,您只需要一个布尔值,通过线程引用的按钮进行切换。如果这是真的,那就照常做,否则就睡一会儿 这是我知道的唯一方法。Thread.sleep(4000) 还是更新的 时间单位。秒。睡眠(4)暂停线程在java中是否可以自由地执行其他事情并在特定时间后继续?,java,multithreading,Java,Multithreading,我想通过按下一个按钮使一个线程在GUI中暂停,该线程可以使用或释放,直到单击相同的按钮,这在java中是可能的。有什么想法吗?我正在使用Swing GUI您可以通过不在其中执行任何操作来模拟暂停 要进行模拟,您只需要一个布尔值,通过线程引用的按钮进行切换。如果这是真的,那就照常做,否则就睡一会儿 这是我知道的唯一方法。Thread.sleep(4000) 还是更新的 时间单位。秒。睡眠(4) 暂停一个线程并立即将其释放用于其他任务,然后根据需要恢复同一个线程是不容易的 您可以使用thread.
暂停一个线程并立即将其释放用于其他任务,然后根据需要恢复同一个线程是不容易的 您可以使用thread.sleep()暂停线程,然后让其他线程执行工作,但暂停的线程将被阻止,并且在取消暂停或中断之前无法执行其他工作 由于线程必须跟踪其堆栈和执行过程中的所有变量,因此在取消暂停之前很难在一个执行流中暂停它并让它执行其他工作。值得注意的是,甚至没有理由尝试这样做,因为您的尝试只是复制线程已经做过的事情(跟踪堆栈等)。因此,当您暂停第一个线程时,您需要做的是让另一个线程执行您想要的操作
长话短说,使用Thread.sleep()暂停,并创建其他线程来执行其他工作(暂停时不能将暂停的线程用于其他工作)。在多线程处理中,如果没有线程本身的配合,就无法真正安全地“强制”线程停止/暂停。(Java有一些构思不周的方法来尝试这样的Thread.suspend()。您可以了解它们被弃用的原因。) 暂停线程的一种常见方法是设置一个布尔标志,并让该线程轮询该状态。这样,它可以安全地暂停或关闭,而不会造成死锁等
此外,正如@Perry所说,一个工作线程可能会因为无所事事而进入睡眠状态。例如,处理排队请求的线程。如果队列是空的,那么它只是静静地等待新的请求。您可能不想执行Thread.sleep的已接受答案,并且应该了解Swing事件队列的工作方式 你想看看: 尤其是:
线程
是什么意思?你想让它运行一个完全不同的任务吗?你不需要释放一个线程来做其他事情,因为你的计算机中没有线程,你有CPU。只要一个线程停止/暂停,另一个线程就可以使用同一个CPU。是的,我知道这种方法,但我希望线程是自由的,并且可以使用。这些方法都是错误的。但是JVM中的非自主线程控制是一个非常困难的问题。。。而且比他们在Java1.0时代意识到的要困难得多。@Stephen C我认为这是现实世界中线程的问题。与单独的进程不同,线程共享更多的状态(例如内存)。Pthreads没有这样的方法。我似乎觉得orig Java的实现者对线程技术不是很了解。@seand Yah,100%正确:挂起是个坏主意,甚至被弃用。就像前面提到的一样,我认为orig Java的人在没有研究现有的API和仔细考虑其含义的情况下,在想“我们应该有办法杀死和挂起…”。Win32还有一些与死机线程相关的函数。@seand-实际上pthreads有一个pthread\u kill方法。但是规范没有(明确地)提到的是,终止一个线程可能会使应用程序的其余部分处于(通常)无法恢复的不确定状态。这本质上就是导致Java开发人员反对Java的Thread
kill/stop/pause/resume方法的原因。我添加了时间单位,但我不推荐它(参见我的答案)。这是一个如何有效的答案?我不知道为什么OP会接受它。这个答案并没有说明你将如何向线程发送睡眠信号,这是最重要的部分,imho。这个问题有点模棱两可。暂停线程听起来像他在追求什么。在重读了这个问题之后,仍然不清楚OP的目的是什么。