2014-12-03 212 views
1

了Android SDK允許自定義使用這樣的非UI線程的堆棧大小:增加AsyncTask堆棧大小?

ThreadGroup group = new ThreadGroup("threadGroup"); 
new Thread(group, runnableObject, "YourThreadName", 20000).start(); 

是否有類似的呼籲,可以由允許我使用AsyncTask API以增加堆棧大小?

+0

要澄清,我在AsynchTask中執行一個操作,該AsynchTask引發一個Stackoverflow消息。如果我使用類似於我發佈的代碼創建的線程中執行操作,堆棧不會溢出。我希望我可以通過提供的api(或者一些不是非常醜陋的AsynchTask類重寫)來增加AsyncTask的堆棧大小。 – ab11 2014-12-03 18:03:47

+0

我的答案已被編輯,並添加了一個解決方案來使用自定義執行程序和自定義的stackSize線程。 – 2014-12-03 18:32:36

+1

我會接受你的答案,因爲它看起來應該完成這項工作。我可能不會實現它,因爲它看起來像解決相對角落案例稍微有風險的方式(我的堆棧溢出異常很少見)。謝謝! – ab11 2014-12-03 18:42:00

回答

2

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它使用sThreadFactoryTHREAD_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

0

所有AsyncTasks都由共享(靜態)ThreadPoolExecutor和LinkedBlockingQueue內部控制。當你在AsyncTask上調用execute時,ThreadPoolExecutor將通過在內部運行一個新線程或排隊它來執行它。所以線程堆棧大小由內部ThreadPoolExecutor控制。您無權訪問它。如果您想控制堆棧大小,請使用您自己的ThreadPoolExecutor。然而,@ yaa110指出堆棧大小參數高度依賴於平臺。