我正在開發一款在Android NDK中運行大多數本機代碼的社交遊戲。遊戲中有3個主要NDK並行線程:將任務提交給線程池給出RejectedExecutionException
- 遊戲線程
- 服務器通信線程
- 主渲染線程(通過Renderer.onRender稱呼)
除此之外,關於java我們使用的是AdWhirl,它通過自己的ScheduledExecutorService
產生自己的線程,但是我們用try-catch塊將每個調用都打包到「計劃」,「提交」,「發佈」,「開始」等,以捕獲RejectedExecutionException
。然而,恐怖的RejectedExecutionException
仍然出現在我們提交的每個新版本中。
來自Android Market的堆棧跟蹤對我來說幾乎沒有任何線索,我們的QA部門也發現難以確定問題,因爲它在測試過程中很難發生(只有我們的用戶報告崩潰)。它只會影響我們的用戶的一小部分,但它仍然
java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1876)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:774)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1295)
at android.os.AsyncTask.execute(AsyncTask.java:394)
at c.onProgressUpdate(Unknown Source)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4632)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
java.util.concurrent.RejectedExecutionException: pool=128/128, queue=10/10
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1961)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1315)
at android.os.AsyncTask.execute(AsyncTask.java:394)
at c.onProgressUpdate(Unknown Source)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3691)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1876)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:774)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1295)
at android.os.AsyncTask.execute(AsyncTask.java:394)
at c.onProgressUpdate(Unknown Source)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
我明白了!感謝您的線索,是否有增加尺寸或有任何限制? 在我們的代碼中,我們沒有使用這麼多的AsyncTask,但我們使用ScheduledExecutorService和其他執行程序並指定較大的線程池。有相當多的執行者,對所有執行者的線程總數是否有任何硬性限制? 如果組合應用程序範圍內的線程數限制,我將不得不檢查...在某個時間點,我們的應用程序正在運行超過20個線程... – Zennichimaro
根據Diane沒有硬性限制,但這是保持十年的最佳做法。您可以設置[最大池大小](http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html#setMaximumPoolSize(int)) – Reno
因爲我已經重寫了應用程序以使用較小的Runnable和AsyncTask ,它現在正在工作,並且沒有看到任何RejectedExecutionException。感謝Reno和Diane! – Zennichimaro