Ich habe einen Hauptthread, der einen anderen Thread aufruft. Die Timeout-Zeit des zweiten Threads beträgt 15 Sekunden. Die derzeitige Implementierung sieht vor, dass der Hauptthread den zweiten Thread alle 2 Sekunden überprüft. Was ich tun muss, ist nur so lange zu warten, wie der zweite Thread fertig ist, bis zu einem Maximum von 15 Sekunden. Ich dachte an warten und benachrichtigen, aber es wird synchronisiert erfordern. Ich denke an die Verwendung von Lock. Ich habe es vorher noch nicht versucht. Bitte helfen Sie mir dabei.
Merci
Diese Idee kann umgesetzt werden? durch die Verwendung von timedwait für ein Sperrobjekt im ersten Thread. Der zweite Thread sollte, sobald er fertig ist, das Sperrobjekt benachrichtigen. Dadurch wird der erste Thread aufgeweckt. Außerdem wird timedwait eine maximale Wartezeit von 15 Sekunden erzwingen.
Ich habe die Lösung aktualisiert und versucht.
public class MyThread {
Object obj = new Object();
boolean isDone = false;
int timeOut = 0;
int runTime = 0;
int id = 0;
public static void main(String[] args) throws Exception {
MyThread mainThread = new MyThread();
mainThread.timeOut = Integer.valueOf(args[0]);
mainThread.runTime = Integer.valueOf(args[1]);
System.out.println("<---- mainThread.timeOut ---------->" + mainThread.timeOut);
System.out.println("<---- mainThread.runTime ---------->" + mainThread.runTime);
ChildThread childThread = new ChildThread(mainThread);
childThread.start();
try {
synchronized (mainThread.obj) {
//Wait the current Thread for 15 seconds
mainThread.obj.wait(mainThread.timeOut * 1000);
}
System.out.println("<---- runTime Over ---------->");
if (mainThread.isDone)
System.out.println("<---- done ---------->");
else
System.out.println("<---- not done ---------->");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void test() {
System.out.println("<--- In business Test method --->");
try {
//Call the bussiness method which may take more time
Thread.sleep(runTime * 1000);
if (runTime <= timeOut)
isDone = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("<---- completes business test method -->");
}
}
class ChildThread extends Thread {
MyThread mainThread;
ChildThread(MyThread mainThread) {
this.mainThread = mainThread;
}
public void run() {
System.out.println("ChildThread: the run method");
mainThread.test();
//Finished the work,notify the waiting thread.
synchronized(mainThread.obj) {
mainThread.obj.notify();
}
}
}