For example, I am trying to fetch the contents of a web-page.
If within 3 seconds, I get the response, its good, otherwise, I want to give a message to the user that internet is too slow.
Now, how do I do this?
You could make use of the ExecutorService and its timeout facilities. The idea is to execute the method you want to call in a different thread, and let the ExecutorService cancel it after a specific time. Here is a simple example, using two fixed threads. You'd have to adapt this to your needs.
Make a class MyTask implements Callable<Void>
package testapp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
class MyTask implements Callable<Void> {
    private String name;
    private long sleepTime;
    public MyTask(String name, long sleepTime) {
        this.name = name;
        this.sleepTime = sleepTime;
    }
    public Void call() throws Exception {
        System.out.println("Starting task " + name);
        Thread.sleep(sleepTime);
        System.out.println("Finished task " + name);
        return null;
    }
}
Use this as is done here
public class ExecutorServiceTest {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(2);
        Collection<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
        tasks.add(new MyTask("Task1", 10000));
        tasks.add(new MyTask("Task2", 2000));
        System.out.println(new java.util.Date());
        List<Future<Void>> taskFutures = service.invokeAll(tasks, 2L, TimeUnit.SECONDS);
        for (Future<Void> future : taskFutures) {
            System.out.println("Done: " + future.isDone());
            System.out.println("Cancelled: " + future.isCancelled());
        }
        System.out.println(new java.util.Date());
        System.out.println("END");
    }
}
 
No comments:
Post a Comment