在Java中:如何让线程监视另一个线程?

对不起,问题很简单。 我是初学者。

我必须创建线程来计算某些东西,而第一个线程工作,另一个必须测量第一个线程是否在指定时间内计算函数。 如果没有,它必须抛出exception。 否则它会返回答案。

我将采用java.util.concurrent组件 – 简单的例子

public void myMethod() { // select some executor strategy ExecutorService executor = Executors.newFixedThreadPool(1); Future f = executor.submit(new Runnable() { @Override public void run() { heresTheMethodToBeExecuted(); } }); try { f.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { // do something clever } catch (ExecutionException e) { // do something clever } catch (TimeoutException e) { // do something clever } } 

让你的线程在完成时通知同步对象,让你的另一个线程等待x毫秒完成它。

 public class Main { private static final Object mThreadLock = new Object(); static class DoTaskThread extends Thread { public void run() { try { int wait = new Random().nextInt(10000); System.out.println("Waiting " + wait + " ms"); Thread.sleep(wait); } catch (InterruptedException ex) { } synchronized (mThreadLock) { mThreadLock.notifyAll(); } } } /** * @param args the command line arguments */ public static void main(String[] args) { synchronized (mThreadLock) { DoTaskThread thread = new DoTaskThread(); thread.start(); try { // Only wait 2 seconds for the thread to finish mThreadLock.wait(2000); } catch (InterruptedException ex) { } if (thread.isAlive()) { throw new RuntimeException("thread took too long"); } else { System.out.println("Thread finished in time"); } } } } 

看看http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination(long,%20java.util.concurrent.TimeUnit ),它可以让你处理这个问题而不用自己处理线程同步。

join比使用lock更简单。

join (millis)
此线程最多等待毫秒毫秒。 超时为0意味着永远等待。

示例代码:

 Thread calcThread = new Thread(new Runnable(){ @Override public void run() { //some calculation } }); calcThread.start(); //wait at most 2secs for the calcThread to finish. calcThread.join(2000); //throw an exception if the calcThread hasn't completed. if(calcThread.isAlive()){ throw new SomeException("calcThread is still running!"); }