了Android SDK允許自定義使用這樣的非UI線程的堆棧大小:增加AsyncTask堆棧大小?
ThreadGroup group = new ThreadGroup("threadGroup");
new Thread(group, runnableObject, "YourThreadName", 20000).start();
是否有類似的呼籲,可以由允許我使用AsyncTask
API以增加堆棧大小?
了Android SDK允許自定義使用這樣的非UI線程的堆棧大小:增加AsyncTask堆棧大小?
ThreadGroup group = new ThreadGroup("threadGroup");
new Thread(group, runnableObject, "YourThreadName", 20000).start();
是否有類似的呼籲,可以由允許我使用AsyncTask
API以增加堆棧大小?
AsyncTask
具有ThreadFactory
的私有靜態對象(一個匿名內部類)來生成新的一個Thread
[1]:
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
,你可以看到其newThread
方法返回Thread(Runnable runnable, String threadName)
而不stackSize
任何參數。所以你不能改變它。但是,線程中的堆棧大小具有高度依賴於平臺的解釋。它甚至可能被完全忽略[2]。
編輯您可以使用自定義的執行,而不是AsyncTask
它使用sThreadFactory
THREAD_POOL_EXECUTOR
。例如:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
private static final ThreadFactory yourFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
ThreadGroup group = new ThreadGroup("threadGroup");
return new Thread(group, r, "YourThreadName", 20000);
}
};
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
public static final Executor YOUR_CUSTOM_THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, yourFactory);
然後,您可以使用您的自定義執行人:
new AsyncTask().executeOnExecutor(YOUR_CUSTOM_THREAD_POOL_EXECUTOR, Params);
[1] https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java
[2] http://developer.android.com/reference/java/lang/Thread.html
所有AsyncTasks都由共享(靜態)ThreadPoolExecutor和LinkedBlockingQueue內部控制。當你在AsyncTask上調用execute時,ThreadPoolExecutor將通過在內部運行一個新線程或排隊它來執行它。所以線程堆棧大小由內部ThreadPoolExecutor控制。您無權訪問它。如果您想控制堆棧大小,請使用您自己的ThreadPoolExecutor。然而,@ yaa110指出堆棧大小參數高度依賴於平臺。
要澄清,我在AsynchTask中執行一個操作,該AsynchTask引發一個Stackoverflow消息。如果我使用類似於我發佈的代碼創建的線程中執行操作,堆棧不會溢出。我希望我可以通過提供的api(或者一些不是非常醜陋的AsynchTask類重寫)來增加AsyncTask的堆棧大小。 – ab11 2014-12-03 18:03:47
我的答案已被編輯,並添加了一個解決方案來使用自定義執行程序和自定義的stackSize線程。 – 2014-12-03 18:32:36
我會接受你的答案,因爲它看起來應該完成這項工作。我可能不會實現它,因爲它看起來像解決相對角落案例稍微有風險的方式(我的堆棧溢出異常很少見)。謝謝! – ab11 2014-12-03 18:42:00