簡體   English   中英

Java執行程序無法對任務進行排隊

[英]Java executor with no ability to queue tasks

我需要一個Java執行器,如果正在處理其他任務,它會拒絕任務。 我想不可能操縱工作隊列的大小。

有人可能想知道為什么我需要一個具有這種特征的執行者。 我需要能夠輕松更改策略並允許非零隊列大小。

有任何想法嗎?

使用帶有SynchronousQueueThreadPoolExecutor (從此答案中復制)。

它似乎工作:

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.Semaphore;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class SingleTaskExecutor {

public static void main(String[] args) {

    try {
        new SingleTaskExecutor().runTest();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void runTest() throws Exception {

    ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1,
            60L, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>());

    tp.setRejectedExecutionHandler(new RejectedTaskHandler());

    final Semaphore oneTaskDone = new Semaphore(0);
    tp.execute(new Runnable() {
        @Override public void run() { 
            System.out.println("Sleeping");
            try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace();} 
            System.out.println("Done sleeping");
            oneTaskDone.release();
        }
    });
    tp.execute(new Runnable() {
        @Override public void run() { System.out.println("Never happends"); }
        @Override public String toString() { return "Rejected Runnable"; }
    });
    oneTaskDone.acquire();
    tp.execute(new Runnable() {
        @Override public void run() { System.out.println("Running"); }
    });
    tp.shutdown();
    tp.awaitTermination(100, TimeUnit.MILLISECONDS);
    System.out.println("Finished");
}

static class RejectedTaskHandler implements RejectedExecutionHandler {

    @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        System.out.println("Task rejected: " + r);
    }

}

}

從你的陳述

一個在給定的時間。 此外,如果執行處於待處理狀態,則應拒絕其他提交。

我的結論是

一次只處理一個任務並在當前任務處理期間拒絕其他任務是您的要求。 在這種情況下,下面的代碼應該完成這項工作。

BlockingQueue queue = new ArrayBlockingQueue(1);
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 10, TimeUnit.SECONDS, queue, 
ThreadPoolExecutor.DiscardPolicy);

// Submit Your callable task
executor.submit(yourCallableTask);

使用ThreadPoolExecutor 在向執行程序提交任務之前,調用getActiveCount()並檢查它是否等於池大小(意味着所有線程都處於活動狀態)。 如果是,請不要提交任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM