Tips
限制網速可以讓某個下載線程sleep
Review
線程池的主要參數
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
1、corePoolSize(線程池基本大小):當向線程池提交一個任務時,若線程池已創建的線程數小於corePoolSize,即便此時存在空閒線程,也會通過創建一個新線程來執行該任務,直到已創建的線程數大於或等於corePoolSize時,(除了利用提交新任務來創建和啓動線程(按需構造),也可以通過 prestartCoreThread() 或 prestartAllCoreThreads() 方法來提前啓動線程池中的基本線程。)
2、maximumPoolSize(線程池最大大小):線程池所允許的最大線程個數。當隊列滿了,且已創建的線程數小於maximumPoolSize,則線程池會創建新的線程來執行任務。另外,對於無界隊列,可忽略該參數。
3、keepAliveTime(線程存活保持時間)當線程池中線程數大於核心線程數時,線程的空閒時間如果超過線程存活時間,那麼這個線程就會被銷燬,直到線程池中的線程數小於等於核心線程數。
4、workQueue(任務隊列):用於傳輸和保存等待執行任務的阻塞隊列。
5、threadFactory(線程工廠):用於創建新線程。threadFactory創建的線程也是採用new Thread()方式,threadFactory創建的線程名都具有統一的風格:pool-m-thread-n(m爲線程池的編號,n爲線程池內的線程編號)。
5、handler(線程飽和策略):當線程池和隊列都滿了,再加入線程會執行此策略。
Algorithm
括號序列
class Solution {
public bool` `isValid(string s) {`
stack<char>st;`
for(int i=0;i<s.size();i++)`{
`if``(s[i]==``'('``||s[i]==``'['``||s[i]==``'{'``)`
`st.push(s[i]);`
else`
`{`
`if``(st.empty())`
`return` `false``;`
`else`
`{`
`if``(s[i]==``')'``&&st.top()==``'('``)`
`st.pop();`
`else` `if``(s[i]==``']'``&&st.top()==``'['``)`
`st.pop();`
`else` `if``(s[i]==``'}'``&&st.top()==``'{'``)`
`st.pop();}
`}`
`}`
`if``(st.empty())`
`return` `true``;`
`else`
`return` `false``;`
`}`
`};`