线程池、Handler、HandlerThread 执行耗时任务的Demo

1. 线程池、Handler、HandlerThread 执行耗时任务的Demo

  • Executors.newFixedThreadPool(8):
    定长线程池
  • Executors.newSingleThreadScheduledExecutor():
    单线程的定时任务调度线程池,支持定时以及周期性执行任务
  • Handler
    默认Loop为Main,故主要为其他线程与主线程通讯,例如某线程执行完耗时任务后,使用Handler汇报给主线程,让主线程需要刷新UI了
  • HandlerThread
    Loop需要自行指定,谁指定谁就是老大即工作线程,例如某线程执行完耗时任务后,使用HandlerThread汇报给工作线程,让工作线程做事

2. 代码

2.1 线程工具类

package com.sufadi.study;

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.util.Log;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 线程池调用Demo
 * Handle调用Demo
 * HandleThread调用Demo
 */
public class ThreadUtils {

    private static ThreadUtils instance;

    // 定长线程池
    private ExecutorService executorService;

    // 单线程的定时任务调度线程池,支持定时以及周期性执行任务
    private ScheduledExecutorService scheduledExecutorService;

    // 主线程Handler:便于和主线程进行通信,用于前台UI刷新用途
    private Handler mainHandler;

    // 工作线程:用于后台耗时任务
    private Handler bgHandler;
    private HandlerThread bgThread;

    public static ThreadUtils getInstance() {
        if (instance == null) {
            instance = new ThreadUtils();
        }
        return instance;
    }


    public ThreadUtils() {
        // 创建一个定长线程池
        executorService = Executors.newFixedThreadPool(8);
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        mainHandler = new Handler(Looper.getMainLooper());

        bgThread = new HandlerThread("Bg thread");
        bgThread.start();
        bgHandler = new Handler(bgThread.getLooper());
    }

    /**
     * 定长线程池
     */
    void runOnBgThreadUseExecutor(Runnable task) {
        executorService.execute(task);
    }

    /**
     * 单线程的定时任务调度线程池
     */
    void runOnBgThreadDelayUseExecutor(Runnable task, int delayTime) {
        Log.d("Shz_tag", "call runOnBgThreadDelayUseExecutor");
        scheduledExecutorService.schedule(task, delayTime, TimeUnit.MILLISECONDS);
    }

    /**
     * 刷新UI
     */
    void runOnUiThread(Runnable task) {
        mainHandler.post(task);
    }


    /**
     * 延时刷新UI
     */
    void runOnUiThreadDelay(Runnable task, long time) {
        Log.d("Shz_tag", "call runOnUiThreadDelay");
        mainHandler.postDelayed(task, time);
    }

    /**
     * 工作线程:用于执行后台耗时任务
     */
    void runOnBgThread(Runnable task) {
        bgHandler.post(task);
    }

    /**
     * 工作线程:用于延时执行后台耗时任务
     */
    void runOnBgThreadDelay(Runnable task, long time) {
        Log.d("Shz_tag", "call runOnBgThreadDelay");
        bgHandler.postDelayed(task, time);
    }
}

2.2 调用线程工具类

package com.sufadi.study

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import java.io.File

class MainActivity : AppCompatActivity() {

    companion object {
        val TAG = "Shz_tag"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d(TAG, "本demo用途:主要是提供Handler、HandlerThread、Executor 的API使用例子\n" +
                "1. Handler:默认Loop为Main,故主要为其他线程与主线程通讯,例如某线程执行完耗时任务后,使用Handler汇报给主线程,让主线程需要刷新UI了\n" +
                "2. HandlerThread:Loop需要自行指定,谁指定谁就是老大即工作线程,例如某线程执行完耗时任务后,使用HandlerThread汇报给工作线程,让工作线程做事\n" +
                "3. Executor:线程池,主要进行后台耗时任务。例如执行复制大文件等耗时任务。\n")

        ThreadUtils.getInstance().runOnBgThreadDelayUseExecutor({
            Log.d(TAG, "runOnBgThreadDelayUseExecutor: 执行线程池")
        }, 1000)

        ThreadUtils.getInstance().runOnBgThreadUseExecutor {
            Log.d(TAG, "runOnBgThreadUseExecutor: 延时执行线程池")
        }

        ThreadUtils.getInstance().runOnUiThread {
            Log.d(TAG, "runOnUiThread: 刷新UI")
        }

        ThreadUtils.getInstance().runOnUiThreadDelay({ Log.d(TAG, "runOnUiThreadDelay: 延时刷新UI") }, 1000)

        ThreadUtils.getInstance().runOnBgThread {
            Log.d(TAG, "runOnBgThread: 执行后台耗时任务")
        }

        ThreadUtils.getInstance().runOnBgThreadDelay({ Log.d(TAG, "runOnBgThreadDelay: 延时执行后台耗时任务") }, 1000)
    }


}

2.3 运行结果

2022-02-06 13:03:21.222 5971-5971/com.sufadi.study D/Shz_tag: 本demo用途:主要是提供Handler、HandlerThread、Executor 的API使用例子
    1. Handler:默认Loop为Main,故主要为其他线程与主线程通讯,例如某线程执行完耗时任务后,使用Handler汇报给主线程,让主线程需要刷新UI了
    2. HandlerThread:Loop需要自行指定,谁指定谁就是老大即工作线程,例如某线程执行完耗时任务后,使用HandlerThread汇报给工作线程,让工作线程做事
    3. Executor:线程池,主要进行后台耗时任务。例如执行复制大文件等耗时任务。
2022-02-06 13:03:21.223 5971-5971/com.sufadi.study D/Shz_tag: call runOnBgThreadDelayUseExecutor
2022-02-06 13:03:21.225 5971-5971/com.sufadi.study D/Shz_tag: call runOnUiThreadDelay
2022-02-06 13:03:21.225 5971-6011/com.sufadi.study D/Shz_tag: runOnBgThreadUseExecutor: 延时执行线程池
2022-02-06 13:03:21.225 5971-5971/com.sufadi.study D/Shz_tag: call runOnBgThreadDelay
2022-02-06 13:03:21.225 5971-6009/com.sufadi.study D/Shz_tag: runOnBgThread: 执行后台耗时任务
2022-02-06 13:03:21.258 5971-5971/com.sufadi.study D/Shz_tag: runOnUiThread: 刷新UI
2022-02-06 13:03:22.224 5971-6010/com.sufadi.study D/Shz_tag: runOnBgThreadDelayUseExecutor: 执行线程池
2022-02-06 13:03:22.225 5971-5971/com.sufadi.study D/Shz_tag: runOnUiThreadDelay: 延时刷新UI
2022-02-06 13:03:22.226 5971-6009/com.sufadi.study D/Shz_tag: runOnBgThreadDelay: 延时执行后台耗时任务

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值