如何通过停止JAVA中的当前处理线程来启动和运行新的,最重要的线程。即当前线程的处理正在进行,我们希望停止或暂停此线程一段时间并执行新线程。
答案 0 :(得分:1)
Java中的线程没有这样的细粒度控制。您通常会尝试远离线程优先级,因为它会产生脆弱的系统。但是如果你绝对必须,你可以改变线程优先级,大多数系统都会考虑它。
Thread.currentThread().setPriority(Thread.MAX_PRIORITY-1); // make it important
只有在支持此操作时才能暂停其他线程。但请记住,暂停的线程仍会占用所有内存和资源。暂停和恢复线程所需的工作可能无法通过收益来证明。 (在这方面,优先事项更好)。
要暂停线程,您可以使用例如在工作线程中获取的锁。每当它被锁定(由一个更重要的线程)时,它将使工作线程暂停(没有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中有一些替代代码。
答案 1 :(得分:0)
您需要使用Thread的Class join()方法。
假设你有2个线程T1和T2。
当您致电T1.start()
,T1.join()
并致电T2.start()
时,T1会等到T2完成工作,之后T1将会执行。
请仔细阅读以下链接。