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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android如何調(diào)整線程調(diào)用棧大小

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

在常規(guī)的Android開(kāi)發(fā)過(guò)程中,隨著業(yè)務(wù)邏輯越來(lái)越復(fù)雜,調(diào)用棧可能會(huì)越來(lái)越深,難免會(huì)遇到調(diào)用棧越界的情況,這種情況下,就需要調(diào)整線程棧的大小。

當(dāng)然,主要還是增大線程棧大小,尤其是存在jni調(diào)用的情況下,C++層的棧開(kāi)銷有時(shí)候是非常恐怖的,比如說(shuō)遞歸調(diào)用。

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

主線程的線程棧是沒(méi)有辦法進(jìn)行修改的,這個(gè)沒(méi)辦法處理。

針對(duì)線程池的情況,需要在創(chuàng)建線程的時(shí)候,調(diào)用構(gòu)造函數(shù)

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

通過(guò)設(shè)置stackSize參數(shù)來(lái)解決問(wèn)題。

參考代碼如下:

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'); // 工作線程堆棧大小調(diào)整為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(); } } }}

針對(duì)AsyncTask的情況,一般是通過(guò)調(diào)用

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

指定線程池來(lái)運(yùn)行,在特定的線程池中調(diào)整線程棧的大小。

參考代碼如下:

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:增加調(diào)用堆棧大小 AsyncTask和線程池

以上就是Android如何調(diào)整線程調(diào)用棧大小的詳細(xì)內(nèi)容,更多關(guān)于Android 調(diào)整調(diào)用棧大小的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩不卡在线| 亚洲一区亚洲| 久久电影tv| 日本v片在线高清不卡在线观看| 国模大尺度视频一区二区| 性色一区二区| 亚洲a一区二区三区| 老色鬼精品视频在线观看播放| 中文字幕视频精品一区二区三区| 久久精品一区二区国产| 婷婷综合国产| 人人爽香蕉精品| 久久国产精品99国产| 久久精品影视| 亚洲高清成人| 精品国产18久久久久久二百| 国产日韩欧美一区二区三区在线观看| 蜜桃av一区二区在线观看| 狠狠爱www人成狠狠爱综合网| 亚洲www啪成人一区二区| 成人精品国产亚洲| 日产精品一区二区| 精品免费av| 高清不卡一区| 日韩中文影院| 国产精品毛片一区二区三区| 亚洲欧美视频一区二区三区| 波多野结衣久久精品| 久久精品影视| 亚洲毛片一区| 国产色综合网| 亚洲综合色婷婷在线观看| 国产毛片一区| 99日韩精品| 亚洲欧美高清| 日韩中文影院| 秋霞影视一区二区三区| 亚洲日本在线观看视频| 色吊丝一区二区| 久久精品国产在热久久| 国产suv精品一区| 国产精品美女久久久| 国产精品一区亚洲| 久久精品91| 蜜桃久久久久久久| 日韩av二区在线播放| 免费在线亚洲欧美| 欧美久久精品一级c片| 97成人在线| 欧美午夜不卡| 欧美激情麻豆| 蜜臀av一区二区在线免费观看| 欧美欧美黄在线二区| 亚洲日韩视频| 欧洲毛片在线视频免费观看| 日韩成人三级| 免费在线亚洲欧美| 久久一二三区| 在线人成日本视频| 亚洲精品少妇| 亚洲国产欧美日本视频| 日韩综合一区| 久久九九国产| 午夜久久美女| 亚洲理论在线| 欧美激情三区| 久久久久免费av| 性欧美长视频| 日韩国产一区二区三区| 日韩中文字幕不卡| 开心激情综合| 1024精品一区二区三区| 尤物在线精品| 欧美视频久久| 国产综合亚洲精品一区二| 97精品国产| 日韩一区二区久久| 久久国产麻豆精品| 欧美日韩在线二区| 水野朝阳av一区二区三区| 色狠狠一区二区三区| 欧美一区二区三区久久| 综合五月婷婷| 亚洲18在线| 久久av综合| 欧美日韩午夜| 国产精品日本| 欧美一区二区三区高清视频| 久久不见久久见免费视频7 | 蜜臀av一区二区三区| 精品高清久久| 久久美女性网| 蜜桃一区二区三区在线观看| 中日韩男男gay无套| 麻豆精品国产91久久久久久| 成人精品高清在线视频| 日韩精品一级中文字幕精品视频免费观看 | 国产欧美日韩视频在线| 日韩精选在线| 色一区二区三区四区| 成人亚洲欧美| 亚久久调教视频| 麻豆久久久久久久| 国产欧美一区二区三区精品观看| 国产情侣一区| 午夜久久av | 国内揄拍国内精品久久| 欧美日韩国产欧| 久久美女性网| av在线资源| 成人午夜亚洲| 麻豆成人在线观看| 日韩在线播放一区二区| 久久国产福利| 蜜桃伊人久久| 亚洲18在线| 日韩1区2区3区| 日韩一区二区三区高清在线观看| 影院欧美亚洲| 伊人影院久久| 亚洲欧美日韩国产一区二区| 国产综合精品一区| 欧美福利专区| 香蕉视频亚洲一级| 成人午夜网址| 精品免费av在线| 国产字幕视频一区二区| 色黄视频在线观看| 91久久在线| 国产精品红桃| 精品一区二区三区亚洲| 精品视频网站| 日韩欧美在线中字| 亚洲国产日韩欧美在线| 国产欧美日韩在线观看视频| 精品国产日韩欧美精品国产欧美日韩一区二区三区| 亚洲精品成a人ⅴ香蕉片| 欧美精品三级在线| 特黄特色欧美大片| 欧美一级久久| 久久亚洲图片| 午夜一区在线| 亚洲一区二区成人| 日韩影院免费视频| 久久精品国产亚洲一区二区三区| 国产在线视频欧美一区| 国产精品欧美一区二区三区不卡| 国产欧美大片| 激情久久久久久| 婷婷精品在线| 精品国产一级| 国产精品资源| 欧美视频精品全部免费观看| 国产精品一区高清| 高清不卡亚洲| 国产一区白浆| 欧美日韩99| 中文字幕av一区二区三区人| 国产一级成人av| 国产精品黄网站| 亚洲精品.com| 国产欧美69| 麻豆91精品| 欧美男人天堂| 久久国产婷婷国产香蕉| 一区二区视频欧美| av亚洲一区二区三区| 精品视频免费| 精品精品久久| 美女性感视频久久| 美女国产一区| 天堂va蜜桃一区二区三区| 日本黄色精品| 青草av.久久免费一区| 日本视频一区二区| 最新亚洲国产| 日韩国产一区二区三区| 久久不见久久见免费视频7 | 国产欧美久久一区二区三区| 桃色一区二区| 日韩av中文在线观看| 日韩精品免费一区二区夜夜嗨 | 成人综合一区| 精品亚洲免a| av不卡在线看| 久久伊人国产| 亚洲色诱最新| 国产一区二区三区黄网站| 日韩在线观看一区二区| 国产精品18| 亚洲午夜黄色| 国产欧美一区二区三区米奇| 亚洲不卡av不卡一区二区| av中文资源在线资源免费观看| 免费黄网站欧美| 日韩欧美中文字幕一区二区三区 | sm捆绑调教国产免费网站在线观看| 亚洲精品护士| 玖玖玖国产精品| 色偷偷偷在线视频播放|