线程池execute与queue add 区别

[code="java"]
private BlockingQueue queue = new LinkedBlockingQueue();

private ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 50, 10, TimeUnit.SECONDS, queue);

[/code]

请问大婶们,queue.add() 与 executor.execute() 区别,源码实在看的头晕@@

[quote]queue.add() 与 executor.execute() 区别[/quote]
这个...关公战秦琼吗?

queue就是个阻塞队列,add方法是往里面塞东西,不成功抛异常。
通常会用push,和add的区别是不成功则等待。

executor是任务执行器,execute是执行个任务(Runnable接口)的。内部会新建个线程或重用个线程等方式来执行这个任务。
通常推荐用ExecutorService的submit方法来拿结果处理异常等。

这两个东西没多大关系,谈区别也只能说:“它们是两种不同的东西?!”

另外,ThreadPoolExecutor 这个类属于底层实现类,实际使用过程中推荐用Executors这个工厂类来获得实例,不推荐直接使用。

当然如果你是学习目的,那就可以无视推荐了。

关于CPU,理想效果是所有CPU都干活(如果这台机器专门跑这个程序的话)。
但貌似不同系统,线程和系统进程之间的关系比较复杂,可能只能调调试试了吧。

最大值应该是不要超过实际CPU数量来着...

如果你直接往threadpool的queue里面放task,那么表现的结果会和threadpool提交任务不一样:
1. 直接往threadpool提交任务时,如果threadpool 没有到达最大线程数,会直接创建线程执行任务,而不会进去queue
2. Threadpool有RejectedExecution的机制,在无法往queue中offer的时候,会调用一个拒绝机制。而直接调用add方法,一般的queue实现中,会尝试一下offer,没有拒绝以后的机制。

如果你直接往threadpool的queue里面放task,那么表现的结果会和threadpool提交任务不一样:
1. 直接往threadpool提交任务时,如果threadpool 没有到达最大线程数,会直接创建线程执行任务,而不会进去queue
2. Threadpool有RejectedExecution的机制,在无法往queue中offer的时候,会调用一个拒绝机制。而直接调用add方法,一般的queue实现中,会尝试一下offer,没有拒绝以后的机制。

如果你直接往threadpool的queue里面放task,那么表现的结果会和threadpool提交任务不一样:
1. 直接往threadpool提交任务时,如果threadpool 没有到达最大线程数,会直接创建线程执行任务,而不会进去queue
2. Threadpool有RejectedExecution的机制,在无法往queue中offer的时候,会调用一个拒绝机制。而直接调用add方法,一般的queue实现中,会尝试一下offer,没有拒绝以后的机制。