日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android如何調整線程調用棧大小

瀏覽:248日期:2022-09-22 09:31:47

在常規的Android開發過程中,隨著業務邏輯越來越復雜,調用棧可能會越來越深,難免會遇到調用棧越界的情況,這種情況下,就需要調整線程棧的大小。

當然,主要還是增大線程棧大小,尤其是存在jni調用的情況下,C++層的棧開銷有時候是非常恐怖的,比如說遞歸調用。

這就需要分三種情況,主線程,自定義線程池,AsyncTask。

主線程的線程棧是沒有辦法進行修改的,這個沒辦法處理。

針對線程池的情況,需要在創建線程的時候,調用構造函數

public Thread(@RecentlyNullable ThreadGroup group, @RecentlyNullable Runnable target, @RecentlyNonNull String name, long stackSize)

通過設置stackSize參數來解決問題。

參考代碼如下:

import android.support.annotation.NonNull;import android.util.Log;import java.util.concurrent.ThreadFactory;/** * A ThreadFactory implementation which create new threads for the thread pool. */public class SimpleThreadFactory implements ThreadFactory { private static final String TAG = 'SimpleThreadFactory'; private final static ThreadGroup group = new ThreadGroup('SimpleThreadFactoryGroup'); // 工作線程堆棧大小調整為2MB private final static int workerStackSize = 2 * 1024 * 1024; @Override public Thread newThread(@NonNull final Runnable runnable) { final Thread thread = new Thread(group, runnable, 'PoolWorkerThread', workerStackSize); // A exception handler is created to log the exception from threads thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(@NonNull Thread thread, @NonNull Throwable ex) {Log.e(TAG, thread.getName() + ' encountered an error: ' + ex.getMessage()); } }); return thread; }}

import android.support.annotation.AnyThread;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.Log;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Future;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * A Singleton thread pool */public class ThreadPool { private static final String TAG = 'ThreadPool'; private static final int KEEP_ALIVE_TIME = 1; private static volatile ThreadPool sInstance = null; private static int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors(); private final ExecutorService mExecutor; private final BlockingQueue<Runnable> mTaskQueue; // Made constructor private to avoid the class being initiated from outside private ThreadPool() { // initialize a queue for the thread pool. New tasks will be added to this queue mTaskQueue = new LinkedBlockingQueue<>(); Log.d(TAG, 'Available cores: ' + NUMBER_OF_CORES); mExecutor = new ThreadPoolExecutor(NUMBER_OF_CORES, NUMBER_OF_CORES * 2, KEEP_ALIVE_TIME, TimeUnit.SECONDS, mTaskQueue, new SimpleThreadFactory()); } @NonNull @AnyThread public static ThreadPool getInstance() { if (null == sInstance) { synchronized (ThreadPool.class) {if (null == sInstance) { sInstance = new ThreadPool();} } } return sInstance; } private boolean isThreadPoolAlive() { return (null != mExecutor) && !mExecutor.isTerminated() && !mExecutor.isShutdown(); } @Nullable @AnyThread public <T> Future<T> submitCallable(@NonNull final Callable<T> c) { synchronized (this) { if (isThreadPoolAlive()) {return mExecutor.submit(c); } } return null; } @Nullable @AnyThread public Future<?> submitRunnable(@NonNull final Runnable r) { synchronized (this) { if (isThreadPoolAlive()) {return mExecutor.submit(r); } } return null; } /* Remove all tasks in the queue and stop all running threads */ @AnyThread public void shutdownNow() { synchronized (this) { mTaskQueue.clear(); if ((!mExecutor.isShutdown()) && (!mExecutor.isTerminated())) {mExecutor.shutdownNow(); } } }}

針對AsyncTask的情況,一般是通過調用

public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Params... params)

指定線程池來運行,在特定的線程池中調整線程棧的大小。

參考代碼如下:

import android.os.AsyncTask;import android.support.annotation.AnyThread;import android.support.annotation.NonNull;import android.util.Log;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public abstract class AsyncTaskEx<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { private static final String TAG = 'AsyncTaskEx'; private static final int KEEP_ALIVE_TIME = 1; private static volatile ThreadPool sInstance = null; private static int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors(); private final ExecutorService mExecutor; private final BlockingQueue<Runnable> mTaskQueue; public AsyncTaskEx() { // initialize a queue for the thread pool. New tasks will be added to this queue mTaskQueue = new LinkedBlockingQueue<>(); Log.d(TAG, 'Available cores: ' + NUMBER_OF_CORES); mExecutor = new ThreadPoolExecutor(NUMBER_OF_CORES, NUMBER_OF_CORES * 2, KEEP_ALIVE_TIME, TimeUnit.SECONDS, mTaskQueue, new SimpleThreadFactory()); } public AsyncTask<Params, Progress, Result> executeAsync(@NonNull final Params... params) { return super.executeOnExecutor(mExecutor, params); } /* Remove all tasks in the queue and stop all running threads */ @AnyThread public void shutdownNow() { synchronized (this) { mTaskQueue.clear(); if ((!mExecutor.isShutdown()) && (!mExecutor.isTerminated())) {mExecutor.shutdownNow(); } } }}

參考鏈接

Increase AsyncTask stack size? StackOverFlowError: Stack size 1036KB in AsyncTask Android:增加調用堆棧大小 AsyncTask和線程池

以上就是Android如何調整線程調用棧大小的詳細內容,更多關于Android 調整調用棧大小的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
红桃视频欧美| 91p九色成人| 国语精品一区| 国产精品v日韩精品v欧美精品网站| 日韩中文字幕无砖| 亚洲美女91| 日韩成人一级| 久久99精品久久久久久园产越南| 国产精品成人自拍| 精品一区二区三区免费看| 激情综合五月| 色爱综合av| 亚洲欧洲一区| 性色一区二区| 日韩高清电影免费| 国产精品最新自拍| 日本欧美久久久久免费播放网| 97久久精品| 日韩av二区在线播放| 欧美国产先锋| 成人va天堂| 国产女优一区| 欧美日韩一区二区三区在线电影| 国产精品v日韩精品v欧美精品网站 | 国产精品手机在线播放| 国产精品白丝一区二区三区| 国产理论在线| 免费久久精品| 一区二区三区四区在线观看国产日韩| 91精品日本| 日韩国产欧美| 亚洲精华国产欧美| 国产乱子精品一区二区在线观看 | 国产一区二区三区国产精品| 精品捆绑调教一区二区三区| 久久久久99| 麻豆久久精品| 国产精品magnet| 久久三级视频| 亚洲a级精品| 国产一区国产二区国产三区| 亚洲第一精品影视| 日韩精品a在线观看91| 久久一区精品| 99亚洲视频| 国产极品久久久久久久久波多结野| 最新中文字幕在线播放| 日韩午夜高潮| 欧美极品中文字幕| 黄页网站一区| 国产精品日韩精品在线播放| 亚洲播播91| 日本国产欧美| 免费毛片在线不卡| 欧美日韩一区二区高清| 99精品视频精品精品视频| 日韩av不卡在线观看| 亚洲黄色网址| 日本午夜精品久久久久| 久久中文字幕二区| 欧美一级网址| 99亚洲视频| 91亚洲国产| 欧美自拍一区| 好吊日精品视频| 国产精品3区| 久久大逼视频| 亚洲成人不卡| 国产乱码精品| 亚洲欧美久久久| 日韩国产欧美| 国产精品中文| 免费成人av在线播放| 免费高潮视频95在线观看网站| 日韩av电影一区| 日韩视频在线一区二区三区| 成人在线丰满少妇av| 日本在线不卡视频一二三区| 亚洲成人不卡| 久久精品国产99国产精品| 黄色亚洲免费| 婷婷激情一区| 美女久久久久久 | 欧美一区=区三区| 国产精品91一区二区三区| 国产一区日韩| 国产亚洲精品美女久久| 久久先锋影音| av亚洲免费| 婷婷综合六月| 黄色欧美在线| 国产精品丝袜在线播放| 亚洲图片久久| 999久久久亚洲| 国产伦久视频在线观看| 国产欧美三级| 日韩精品91亚洲二区在线观看| 国产一区成人| 狠狠久久婷婷| 国内精品99| 日韩福利一区| 水蜜桃久久夜色精品一区| 国产欧美69| 欧美天堂一区| 日韩精品高清不卡| 日韩亚洲精品在线观看| 亚洲精品成人一区| 久久99伊人| 91久久久精品国产| 欧美va天堂| 黄色不卡一区| 九一精品国产| 亚洲高清成人| 国精品一区二区三区| 日韩精品麻豆| 成人午夜国产| 日韩精品久久久久久久电影99爱 | 亚洲黄色在线| 九色精品91| 亚洲综合国产| 免费久久99精品国产自在现线| 亚洲激情av| 首页国产欧美日韩丝袜| 蜜桃免费网站一区二区三区| 蜜臀va亚洲va欧美va天堂| 六月天综合网| 亚洲精品无吗| 久久精品 人人爱| 欧美精品99| 免费一区二区三区在线视频| 国产一区二区三区国产精品| 国产精品99久久精品| 日韩国产欧美| 99热国内精品| 亚洲视频播放| 亚洲免费婷婷| 亚洲精品精选| 国产精品密蕾丝视频下载| 麻豆久久一区| 日韩中文影院| 伊人精品在线| 亚洲精品人人| 久久99久久久精品欧美| av高清不卡| 99视频在线精品国自产拍免费观看| 美女尤物久久精品| 国产情侣久久| 国产66精品| 蜜臀91精品国产高清在线观看| 视频一区视频二区在线观看| 91成人精品观看| 精品中文在线| 激情欧美国产欧美| 一区二区精品| 欧美激情福利| 国产91精品对白在线播放| 免费在线成人网| 嫩草伊人久久精品少妇av杨幂| 美女网站视频一区| 久久亚洲图片| 国产福利一区二区三区在线播放| 国产99在线| 久久午夜精品| 久久精品国产成人一区二区三区| 久久精品中文| 亚洲深爱激情| 日韩精品乱码av一区二区| 麻豆久久精品| 国产伦理一区| 日韩免费在线| 四季av一区二区凹凸精品| 久久久久国产精品一区二区| 石原莉奈在线亚洲二区| 欧美日本精品| 国产精品亚洲一区二区在线观看| 精品久久97| 日韩一区二区免费看| 欧美亚洲免费| 欧美精选视频一区二区| 成人va天堂| 日韩专区视频网站| 国产在线不卡一区二区三区| 亚洲五月婷婷| 国产日韩欧美一区| 香蕉久久99| 欧美一区网站| 尤物tv在线精品| 国产欧美日韩在线观看视频| 亚洲www啪成人一区二区| 日韩精品视频网| 久久激情一区| 国产精品香蕉| 国产精品视区| 超级白嫩亚洲国产第一| 综合亚洲视频| 欧美日韩在线二区| 日本不卡视频在线| 亚洲国内精品| 久久久久观看| 中文字幕日韩亚洲|