gpt4 book ai didi

java - 在java运行时抢占一个线程为另一个线程

转载 作者:行者123 更新时间:2023-12-01 12:04:05 26 4
gpt4 key购买 nike

如何通过停止 JAVA 中的当前处理线程来启动和运行一个新的、最重要的线程。即当前线程的处理正在进行,我们想要停止或暂停该线程一段时间并执行一个新线程。

最佳答案

Java 中没有对线程进行如此细粒度的控制。您通常会尝试远离线程优先级,因为它会产生脆弱的系统。但如果绝对必要,您可以更改线程优先级,大多数系统都会考虑它。

Thread.currentThread().setPriority(Thread.MAX_PRIORITY-1); // make it important

仅当其他线程支持此操作时,您才可以暂停它们。但请记住,暂停的线程仍然会占用所有内存和资源。暂停和恢复线程所需的工作可能无法通过 yield 来证明是合理的。 (在这方面优先级更好)。

要暂停线程,您可以使用在工作线程中获取的锁。每当它被锁定(被更重要的线程锁定)时,它都会使工作线程暂停(不使用 CPU)。

class WorkerThread {
Semaphore sem;

void checkForPause() throws InterruptedExec{
synchronized(sem) { // make sure unpauseThread() cant release it
sem.aquire(); // will block when pauseThread aquired one
sem.release();
}
}

void pauseThread() {
sem.aquire();
}

void unpauseThread() {
synchronized(sem) { sem.release(); } // only release after checkForPause()
}

work run() {
while(true) { // do something in a loop
checkForPause();
// do actual work in small steps
}
}
}

现在可以使用pauseThread()和unpauseThread()来控制WorkerThread实例。

顺便说一句:在旧版 Java 中,有 Thread#suspend()Thread#resume(),但它不应该在现代程序中使用。在 deprecation notice是一些替代代码。

关于java - 在java运行时抢占一个线程为另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27779118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com