在java中运行时抢占一个Thread for another

时间:2015-01-05 12:01:32

标签: java

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

2 个答案:

答案 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将会执行。

请仔细阅读以下链接。

Thread join() method