Android线程调用栈大小如何调整?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
在常规的Android开发过程中,随着业务逻辑越来越复杂,调用栈可能会越来越深,难免会遇到调用栈越界的情况,这种情况下,就需要调整线程栈的大小。
当然,主要还是增大线程栈大小,尤其是存在jni调用的情况下,c++层的栈开销有时候是非常恐怖的,比如说递归调用。
这就需要分三种情况,主线程,自定义线程池,AsyncTask。
<强>主线程的线程栈是没有办法进行修改的,这个没办法处理。强>
<强>针对线程池的情况,需要在创建线程的时候,调用构造函数强>
公共线程(@RecentlyNullable ThreadGroup集团@RecentlyNullable可运行目标,@RecentlyNonNull字符串名称,长stackSize)
通过设置<代码> stackSize> 代码参数来解决问题。
参考代码如下:
进口android.support.annotation.NonNull; 进口android.util.Log; 进口java.util.concurrent.ThreadFactory;/* * * ThreadFactory实现创建新线程的线程池。 */公共类SimpleThreadFactory实现ThreadFactory { 私有静态最终字符串标签=癝impleThreadFactory"; 私人最终静态ThreadGroup集团=新的ThreadGroup (“SimpleThreadFactoryGroup");//工作线程堆栈大小调整为2 mb 私人最终静态int workerStackSize=2 * 1024 * 1024; @Override 公共线程newThread (@NonNull最终Runnable Runnable) { 最后一个线程的线程=新线程(集团、可运行、“PoolWorkerThread", workerStackSize);//创建一个异常处理程序从线程日志异常 线程。setUncaughtExceptionHandler(新Thread.UncaughtExceptionHandler () { @Override 公共空间uncaughtException (@NonNull线程线程,@NonNull Throwable特异){ 日志。e(标签,thread.getName () +“;遇到一个错误:“;+ ex.getMessage ()); } }); 返回线程; } }
进口android.support.annotation.AnyThread; 进口android.support.annotation.NonNull; 进口android.support.annotation.Nullable; 进口android.util.Log; 进口java.util.concurrent.BlockingQueue; 进口java.util.concurrent.Callable; 进口java.util.concurrent.ExecutorService; 进口java.util.concurrent.Future; 进口java.util.concurrent.LinkedBlockingQueue; 进口java.util.concurrent.ThreadPoolExecutor; 进口java.util.concurrent.TimeUnit;/* * *单线程池 */公开课ThreadPool { 私有静态最终字符串标签=癟hreadPool"; 私有静态最终int KEEP_ALIVE_TIME=1; 私有静态稳定ThreadPool sInstance=零; 私有静态int NUMBER_OF_CORES=Runtime.getRuntime () .availableProcessors (); 私人最终ExecutorService mExecutor; 私人最终BlockingQueuemTaskQueue;//构造函数私有,以避免从外面被启动的类 私人ThreadPool () {//初始化一个队列的线程池。新任务将被添加到此队列 ,mTaskQueue=new LinkedBlockingQueue<的在(); 日志。d(标签,“可用内核:“;+ NUMBER_OF_CORES); mExecutor=new ThreadPoolExecutor (NUMBER_OF_CORES, NUMBER_OF_CORES * 2 KEEP_ALIVE_TIME TimeUnit。秒,mTaskQueue新SimpleThreadFactory ()); } @NonNull @AnyThread 公共静态ThreadPool getInstance () { 如果(null==sInstance) { 同步(ThreadPool.class) { 如果(null==sInstance) { sInstance=new ThreadPool (); } } } 返回sInstance; } 私人布尔isThreadPoolAlive () { 返回(零!=mExecutor),,! mExecutor.isTerminated (),,! mExecutor.isShutdown (); } @Nullable @AnyThread 公共& lt; T>Future submitCallable (@NonNull最终Callable c) { 同步(){ 如果(isThreadPoolAlive ()) { 返回mExecutor.submit (c); } } 返回null; } @Nullable @AnyThread ,公共Future<和# 63的在submitRunnable (@NonNull最终可运行r) { 同步(){ 如果(isThreadPoolAlive ()) { 返回mExecutor.submit (r); } } 返回null; }/*删除队列中的所有任务并停止所有正在运行的线程 */@AnyThread 公共空间shutdownNow () { 同步(){ mTaskQueue.clear (); 如果((! mExecutor.isShutdown ()),,(! mExecutor.isTerminated ())) { mExecutor.shutdownNow (); } } } }
<>强针对AsyncTask的情况,一般是通过调用强>
公共最终AsyncTaskAndroid线程调用栈大小如何调整