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物件到...