Android线程调用栈大小如何调整

  

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>FuturesubmitCallable (@NonNull最终Callablec) {
  同步(){
  如果(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的情况,一般是通过调用

公共最终AsyncTask

Android线程调用栈大小如何调整