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``;`
`}`
`};`
网友评论