成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

在常規的Android開發過程中,隨著業務邏輯越來越復雜,調用??赡軙絹碓缴睿y免會遇到調用棧越界的情況,這種情況下,就需要調整線程棧的大小。

當然,主要還是增大線程棧大小,尤其是存在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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
午夜一级久久| 人人爽香蕉精品| 香蕉加勒比综合久久| 国内精品国语自产拍在线观看| 欧美成人福利视频| 久久99精品久久久久婷婷| 免费亚洲一区二区| 亚洲高清在线精品| 国产农村妇女精品一区二区| 中文字幕一区三区| 欧美日本韩国在线| 国产三区在线成人av| 99久久久精品| 日韩一区和二区| 国产一区二区三区免费观看| 欧美日韩一区二区三区视频| 蜜臀久久99精品久久久久久9| 国产精品亚洲综合| 亚洲男同性视频| 国产精品手机视频| 亚洲精品国产精华液| 亚洲美女啪啪| 亚洲影院免费观看| 午夜亚洲福利在线老司机| 一区二区三区日本| 欧美全黄视频| 国产精品不卡一区二区三区| 欧美视频亚洲视频| 中文字幕亚洲一区二区av在线| 欧美日韩p片| 国产精品久久福利| 亚洲每日更新| 亚洲大片在线观看| 国产伦精品一区二区三区四区免费| 亚洲一区自拍偷拍| 91福利国产精品| 激情综合色综合久久综合| 欧美丰满少妇xxxbbb| 国产精品资源在线看| 日韩欧美视频一区| 99精品1区2区| 国产精品美日韩| 国产欧美丝祙| 日韩国产精品大片| 在线视频观看一区| 国产精品18久久久久久久久久久久 | 成人美女视频在线观看18| 欧美精品丝袜久久久中文字幕| 久久国产人妖系列| 欧美一区二区视频网站| 盗摄精品av一区二区三区| 久久伊人蜜桃av一区二区| 欧美日韩第一区| 成人免费一区二区三区在线观看| 亚洲精品在线二区| 五月婷婷久久丁香| 在线中文字幕一区二区| 精品一区二区三区在线播放 | 欧美性xxxxx极品少妇| 国产精品综合一区二区| 精品美女被调教视频大全网站| 91麻豆国产福利精品| 国产精品毛片a∨一区二区三区| 9国产精品视频| 日本亚洲天堂网| 欧美精品丝袜中出| 99久久er热在这里只有精品15| 国产精品美女一区二区在线观看| 日韩视频在线观看国产| 午夜精品一区二区三区电影天堂| 欧美色图激情小说| 99re热视频精品| 一区二区高清在线| 欧美日韩亚州综合| 91污片在线观看| 亚洲精品写真福利| 日本丶国产丶欧美色综合| 国产成人综合亚洲网站| 国产日韩欧美精品综合| 午夜一区在线| 国产在线播放一区三区四| 久久久久国产精品麻豆| 国产精品亚洲综合| 精东粉嫩av免费一区二区三区| 欧美精品一区二区三区很污很色的| 国内精品亚洲| 日韩av中文字幕一区二区| 欧美大片一区二区| 亚洲巨乳在线| 看片网站欧美日韩| 久久亚洲欧美国产精品乐播| 亚洲最黄网站| 成人综合在线观看| 亚洲午夜电影在线观看| 精品播放一区二区| 免费在线播放第一区高清av| 成人av在线电影| 亚洲福利视频一区| 久久久久青草大香线综合精品| 午夜在线视频观看日韩17c| 成人av在线影院| 日韩在线播放一区二区| 中文在线免费一区三区高中清不卡| 欧美系列亚洲系列| 尹人成人综合网| 国产69精品久久777的优势| 一区二区欧美在线观看| 亚洲精品一区二区精华| 欧美自拍偷拍午夜视频| 一区国产精品| 国产精品996| 亚洲午夜激情网页| 欧美精品一区二区三区在线 | 欧美淫片网站| 日本不卡的三区四区五区| 久久精品一二三| 欧美午夜精品理论片a级按摩| 99视频在线精品| 日韩福利电影在线观看| 国产精品免费久久| 欧美日韩国产不卡| 亚洲国产片色| 成人av资源下载| 日韩综合在线视频| 亚洲另类中文字| 久久在线观看免费| 在线亚洲人成电影网站色www| 黄色日韩在线| 国产一区在线视频| 亚洲国产精品久久人人爱| 国产三级精品视频| 717成人午夜免费福利电影| 亚洲一区影院| 你懂的国产精品| 国产精品一区免费视频| 亚洲伊人色欲综合网| 国产欧美视频一区二区| 欧美一级欧美三级在线观看| 久久精品30| 99国产精品久久久久老师| 99久久久无码国产精品| 九九视频精品免费| 香港成人在线视频| 亚洲欧洲日韩女同| 国产日韩影视精品| 日韩欧美国产综合| 欧美制服丝袜第一页| 国产精品免费在线| 在线欧美亚洲| 欧美日韩国产精品一区二区亚洲| 国产精品一卡二卡在线观看| 日韩中文字幕一区二区三区| 亚洲欧美视频在线观看| 国产偷国产偷精品高清尤物| 欧美一级欧美一级在线播放| 欧美天堂一区二区三区| 性娇小13――14欧美| 99亚洲一区二区| 91麻豆精东视频| 成人国产一区二区三区精品| 午夜国产精品影院在线观看| 亚洲欧美成人一区二区三区| 国产蜜臀97一区二区三区| 337p日本欧洲亚洲大胆精品 | 久久久久久久久久久久电影| 91精品国产综合久久香蕉的特点| 色婷婷综合久久久| 香蕉久久夜色精品| 国产伦精品一区二区三区高清版 | 国产精品三级av| 久久亚洲综合色一区二区三区| 91精品一区二区三区久久久久久| 色偷偷88欧美精品久久久| 亚洲欧美精品在线观看| 99热这里只有成人精品国产| 在线成人国产| 黑丝一区二区三区| 激情一区二区| 欧美日本一区二区视频在线观看 | 视频一区二区三区在线| 亚洲国产欧美另类丝袜| 亚洲免费三区一区二区| 亚洲欧洲另类国产综合| 中文字幕一区二区三| 成人免费在线播放视频| 1024成人网| 亚洲欧美日韩一区二区三区在线观看| 国产精品区一区二区三区| 日本一区二区动态图| 国产亚洲精品久| 国产性天天综合网| 久久久亚洲高清| 久久久91精品国产一区二区精品| 久久精品一区二区| 中文字幕乱码一区二区免费| 中文字幕免费不卡| 最近日韩中文字幕| 一区二区三区在线播放| 亚洲综合精品久久| 亚洲午夜成aⅴ人片|