Tôi có một ScheduledThreadPoolExecutor mà tôi lên lịch một nhiệm vụ để chạy với tốc độ cố định. Tôi muốn nhiệm vụ được chạy với độ trễ được chỉ định cho tối đa 10 lần cho đến khi nó "thành công". Sau đó, tôi sẽ không muốn nhiệm vụ được thử lại. Vì vậy, về cơ bản tôi sẽ cần phải ngừng chạy tác vụ theo lịch trình khi tôi muốn nó được dừng lại, nhưng không tắt ScheduledThreadPoolExecutor. Bất kỳ ý tưởng làm thế nào tôi muốn làm điều đó?Làm thế nào để dừng một tác vụ trong ScheduledThreadPoolExecutor khi tôi nghĩ rằng nó đã hoàn thành
Dưới đây là một số giả -
public class ScheduledThreadPoolExecutorTest
{
public static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(15); // no multiple instances, just one to serve all requests
class MyTask implements Runnable
{
private int MAX_ATTEMPTS = 10;
public void run()
{
if(++attempt <= MAX_ATTEMPTS)
{
doX();
if(doXSucceeded)
{
//stop retrying the task anymore
}
}
else
{
//couldn't succeed in MAX attempts, don't bother retrying anymore!
}
}
}
public void main(String[] args)
{
executor.scheduleAtFixedRate(new ScheduledThreadPoolExecutorTest().new MyTask(), 0, 5, TimeUnit.SECONDS);
}
}
Lời cảm ơn hoàn hảo! Tôi đã biết về lịch biểu nhưng tôi đã cố gắng sử dụng cách này: t = executor.scheduleAtFixedRate (MyTask mới(), 0, 1, TimeUnit.SECONDS); t.cancel (true); sẽ không bao giờ hoạt động vì những lý do rõ ràng. Việc hủy tác vụ bên trong việc thực hiện tác vụ có vẻ đúng. – mystarrocks
Cảm ơn. Điều này đã giúp. Thú vị để lưu ý rằng ví dụ này không bao giờ thoát. Tôi nghĩ rằng bạn cần tắt máy thi hành – Kirby
Hoặc đúng hơn là bạn cần 't.get()' và một trình tắt máy thi hành bên trong khối catch của CancellationException – Kirby