Change delay of one thread in threadpool

2k views Asked by At

I add three threads with different tasks and different delays to my threadpool and everything works pretty fine.

static ScheduledExecutorService scheduleTaskExecutor;
static ScheduledFuture<?> future1;
static ScheduledFuture<?> future2;
static ScheduledFuture<?> future3;

public void onCreate(Bundle savedInstanceState) {
    scheduleTaskExecutor = Executors.newScheduledThreadPool(3);
    future1 = scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable1() {...}, 0, olddelay1, TimeUnit.SECONDS); // Task 1
    future2 = scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable2() {...}, 0, olddelay2, TimeUnit.SECONDS); // Task 2
    future3 = scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable3() {...}, 0, olddelay3, TimeUnit.SECONDS); // Task 3
}

Later during runtime i want to change the delay of one of these threads (no matter which), the others shall work on with the old delay. I thought the ScheduledFuture references may help and tried the following code (for example for the second thread), but after execution there is only one thread left in the threadpool (Task 2).

public void changeDelay2(int newdelay2){
    future2.cancel(true);
    future2 = scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable2() {...}, 0, newdelay2, TimeUnit.SECONDS); // Task 2
}

So is there a possibility to change the delay of only one thread?

1

There are 1 answers

0
Raniz On BEST ANSWER

You do it exactly as you have done - there must be some other error in your code.

Here's a complete, working example that does the same thing you're doing. The output below shows that it is working as intended.

public class Reschedule {

    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

        // Schedule three tasks
        ScheduledFuture future1 = executor.scheduleAtFixedRate(() -> {
            System.out.printf("%03ds: This is the first runnable, reporting in%n", (System.currentTimeMillis() - start) / 1000);
        }, 0, 5, TimeUnit.SECONDS);
        ScheduledFuture future2 = executor.scheduleAtFixedRate(() -> {
            System.out.printf("%03ds: This is the second runnable, reporting in%n", (System.currentTimeMillis() - start) / 1000);
        }, 2, 10, TimeUnit.SECONDS);
        ScheduledFuture future3 = executor.scheduleAtFixedRate(() -> {
            System.out.printf("%03ds: This is the third runnable, reporting in%n", (System.currentTimeMillis() - start) / 1000);
        }, 5, 15, TimeUnit.SECONDS);

        // Wait some
        Thread.sleep(30000);

        // Reschedule the second task
        System.out.printf("%03ds: Rescheduling the second runnable to run at 20 second intervals%n", (System.currentTimeMillis() - start) / 1000);
        future2.cancel(true);
        future2 = executor.scheduleAtFixedRate(() -> {
            System.out.printf("%03ds: This is the second runnable, reporting in%n", (System.currentTimeMillis() - start) / 1000);
        }, 2, 20, TimeUnit.SECONDS);
    }
}

As you can see in the below output rescheduling the second task resets it and changes it from running every 10 seconds to every 20 seconds and the first and third tasks are unaffected.

Output:

000s: This is the first runnable, reporting in
002s: This is the second runnable, reporting in
005s: This is the first runnable, reporting in
005s: This is the third runnable, reporting in
010s: This is the first runnable, reporting in
012s: This is the second runnable, reporting in
015s: This is the first runnable, reporting in
020s: This is the first runnable, reporting in
020s: This is the third runnable, reporting in
022s: This is the second runnable, reporting in
025s: This is the first runnable, reporting in
030s: This is the first runnable, reporting in
030s: Rescheduling the second runnable to run at 20 second intervals
032s: This is the second runnable, reporting in
035s: This is the first runnable, reporting in
035s: This is the third runnable, reporting in
040s: This is the first runnable, reporting in
045s: This is the first runnable, reporting in
050s: This is the first runnable, reporting in
050s: This is the third runnable, reporting in
052s: This is the second runnable, reporting in
055s: This is the first runnable, reporting in
060s: This is the first runnable, reporting in
065s: This is the first runnable, reporting in
065s: This is the third runnable, reporting in
070s: This is the first runnable, reporting in
072s: This is the second runnable, reporting in