Extend thread class to support following functionalities.
boolean isFinished()
Return true then thread finishes its execution, else false.
public void waitUntilFinished(long timeout)
Wait until the thread finished it’s execution or the timeout is elapsed.
Find the below working application.
WorkerThread.java
package com.sample.app.threads;
public class WorkerThread extends Thread {
private Object notify;
private volatile boolean finished = false;
private final Runnable runnable;
public WorkerThread(Runnable runnable, Object notify) {
this.runnable = runnable;
this.notify = notify != null ? notify : this;
}
public WorkerThread(Runnable runnable) {
this(runnable, null);
}
public synchronized boolean isFinished() {
return finished;
}
public void waitUntilFinished(long timeout) throws InterruptedException {
long endTime = System.currentTimeMillis() + timeout;
synchronized (notify) {
long currentTime = System.currentTimeMillis();
while (!finished && currentTime < endTime) {
notify.wait(endTime - currentTime);
currentTime = System.currentTimeMillis();
}
}
}
public void run() {
try {
runnable.run();
} catch (Throwable t) {
t.printStackTrace(System.err);
throw t;
} finally {
synchronized (notify) {
finished = true;
notify.notifyAll();
}
}
}
}
WorkerThreadDemo.java
package com.sample.app.threads;
import java.util.concurrent.TimeUnit;
public class WorkerThreadDemo {
public static void main(String[] args) throws InterruptedException {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Started executing the process");
try {
TimeUnit.SECONDS.sleep(6);
} catch (InterruptedException e) {
e.printStackTrace(System.err);
}
System.out.println("Finished execution....");
}
};
WorkerThread workerThread = new WorkerThread(runnable);
workerThread.start();
workerThread.waitUntilFinished(4000l);
System.out.println("Is finished : " + workerThread.isFinished());
workerThread.waitUntilFinished(3000l);
System.out.println("Is finished : " + workerThread.isFinished());
}
}
Output
Started executing the process Is finished : false Finished execution.... Is finished : true
You may like
Quick guide to assertions in Java
java.util.Date vs java.sql.Date
How to break out of nested loops in Java?
Implementation of Bag data structure in Java
Scanner throws java.util.NoSuchElementException while reading the input
No comments:
Post a Comment