j u c執行緒 執行緒池

2021-10-01 22:49:27 字數 2346 閱讀 6440

final void runworker(worker w)  catch (runtimeexception x)  catch (error x)  catch (throwable x)  finally 

} finally

}completedabruptly = false;

} finally

}

private runnable gettask() 

int wc = workercountof(c);

// are workers subject to culling?

boolean timed = allowcorethreadtimeout || wc > corepoolsize;

if ((wc > maximumpoolsize || (timed && timedout))

&& (wc > 1 || workqueue.isempty()))

try catch (interruptedexception retry)

}}

首先把callable或者runnable物件包裝成futuretask物件

public futuresubmit(runnable task, t result) 

public futuresubmit(callabletask)

protected runnablefuturenewtaskfor(callablecallable)

public v get() throws interruptedexception, executionexception 

private int awaitdone(boolean timed, long nanos)

throws interruptedexception

int s = state;

if (s > completing)

else if (s == completing) // cannot time out yet

thread.yield();

else if (q == null)

q = new waitnode();

else if (!queued)

queued = unsafe.compareandswapobject(this, waitersoffset,

q.next = waiters, q);

else if (timed)

locksupport.parknanos(this, nanos);

}else

locksupport.park(this); // 如果不能立刻獲取執行結果, 則把當前執行緒掛起,掛起caller執行緒

}}

執行任務

任務執行結束後,喚醒被掛起的等待該任務結果的執行緒,喚醒caller執行緒

public void run()  catch (throwable ex) 

if (ran)

set(result); // 喚醒caller執行緒

}} finally

}

喚醒caller執行緒

protected void set(v v) 

}private void finishcompletion()

waitnode next = q.next;

if (next == null)

break;

q.next = null; // unlink to help gc

q = next;

}break;}}

done();

callable = null; // to reduce footprint

}

public void execute(runnable command) 

if (isrunning(c) && workqueue.offer(command))

else if (!addworker(command, false)) // 當前執行緒已經達到核心執行緒數,且任務佇列已滿, 則建立超出核心執行緒數, 但是不多於最大執行緒數的新的執行緒。

reject(command);

}

4種拒絕策略

abortpolicy 直接丟擲異常

discardpolicy 直接丟棄

discardoldestpolicy 丟棄最老的任務, 為新任務騰地方

callerrunspolicy 新任務在caller執行緒中執行

J U C執行緒池

執行緒的建立和切換都是代價比較大的。所以,我們需要有乙個好的方案能做到執行緒的復用,這就涉及到乙個概念 執行緒池。合理的使用執行緒池能夠帶來3個很明顯的好處 降低資源消耗 通過重用已經建立的執行緒來降低執行緒建立和銷毀的消耗 提高響應速度 任務到達時不需要等待執行緒建立就可以立即執行。提高執行緒的可...

JUC 執行緒池數量

去乙個網頁抓資料儲存到資料庫中,這個過程也就1秒中吧 執行緒池fixedthreadpool配製多少合適?如果是cpu密集型應用,則執行緒池大小設定為n 1 n為cpu的核數 如果是io密集型應用,則執行緒池大小設定為2n 1 這裡去乙個網頁抓資料 需要建立http請求響 io 應後拿到資料,然後再...

執行緒池 juc包下

1.使用執行緒池的優點如下 1.降低資源消耗 通過重複利用已建立的執行緒,降低執行緒建立與銷毀帶來的損耗。2.提高響應速度 當新任務到達時,任務不需要等待執行緒建立就可以立即執行。3.提高執行緒的可管理性 使用執行緒池可以統一進行執行緒分配 排程與監控。當乙個runnable或callable物件到...