Future, future.cancel()可以刪除同步阻塞任務


【Future】

image

http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/util/concurrent/Future.html

 

【好奇】

(1)future.cancel(mayInterruptIfRunning)的內部實現會是什么樣子的?可以中斷一個線程池里正在執行着的“那一個”任務。

可猜想,必定記錄着具體線程標識,且發了一個中斷信號。

(2)猜測,應該只是發一個中斷信號,可以中斷阻塞中的操作。而如果是while(true); 這樣的占用CPU的非阻塞式操作,是中斷不掉的,也即線程依舊在跑,占用着線程池資源。

【注意】

a). 線程池資源有限,有些任務會submit()不進去,拋異常:java.util.concurrent.RejectedExecutionException

b).只要submit()成功的,無論是線程正在執行,或是在BlockingQueue中等待執行,future.cancel()操作均可中斷掉線程。也即,與其真正執行並無關系,阻塞中或等待被調度執行中,都將被中斷。

 

【demo示例】

future.cancel中斷阻塞操作:

 

public class Main {
    
    /** 信號量 */
    private Semaphore semaphore = new Semaphore(0); // 1
    
    /** 線程池 */
    private ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3));
    
    /** Future */
    private Future<String> future ;
    
    public void test(){
        
        future = pool.submit(new Callable<String>() {
 
            @Override
            public String call() {
                String result = null;
                try {
                    // 同步阻塞獲取信號量
                    semaphore.acquire();
                    result = "ok";
                } catch (InterruptedException e) {
                    result = "interrupted";
                }
                return result;
            }
        });
        
        String result = "timeout";
        try {
            // 等待3s
            result = future.get(3, TimeUnit.SECONDS);
        }catch (Exception e) {
            System.out.println("超時異常");
        }
        
        // 刪除線程池中任務
        boolean cancelResult = future.cancel(true);
        
        System.out.println("result is " + result);
        System.out.println("刪除結果:"  +cancelResult);
        System.out.println("當前active線程數:" +pool.getActiveCount());
        
    }
 
    public static void main(String[] args) {
        Main o = new Main();        
        o.test();
    }
 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM