Add*_*dev 7 java multithreading android
我正在尝试理解ThreadPoolExecutor类.我已经阅读了这个答案和Javadoc.但是我的实验与那个描述不符:
我用工厂初始化线程池来跟踪id
int tcounter = 0;
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(1000), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new mThread(tcounter++, r);
}
});
public class mThread extends Thread {
int id;
private mThread(int id, Runnable run) {
super(run);
GLog.e("created thread " + id);
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
然后任务:
public class mRunanble implements Runnable {
int value = 0;
private mRunanble(int value) {
super();
this.value = value;
}
@Override
public void run() {
SystemClock.sleep(3000);
Thread t = Thread.currentThread();
if (t instanceof mThread) {
GLog.e("Say " + (value) + " on thread " + ((mThread) t).id);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并为动作指定一个按钮:
executor.execute(new mRunanble(i++));
Run Code Online (Sandbox Code Playgroud)
但我垃圾邮件那个按钮并且永远不会创建第三个线程,所以ThreadPoolExecutor构造函数(maximumPoolSize=4
)中的第二个参数是什么.我正在编写4个线程来创建,其中2个在执行结束1分钟后被杀死
来自API ThreadPoolExecutor
:
如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程.
您的队列永远不会填充,因为它的容量为1000
.如果您将容量更改为1
,您将看到Thread
正在创建.
本Executors
类使用SynchronousQueue
它的newCachedThreadPool
方法,所以你可能要考虑使用它.
在 ThreadPoolExecutor 中,当 corePoolSize no 不足以执行您的任务时,maximumPoolSize 就会出现,并且如果所有 no 都被任务占用,则只会再创建一个线程来执行任务。此 no 可以增长到 maxPoolSize。
编辑您误解了 maxPoolsize 概念。请参阅下面的链接。
http://www.bigsoft.co.uk/blog/index.php/2009/11/27/rules-of-a-threadpoolexecutor-pool-size
归档时间: |
|
查看次数: |
7434 次 |
最近记录: |