发布时间:2025-12-09 12:05:26 浏览次数:1
转载请注明链接:https://blog.csdn.net/feather_wch/article/details/82556153
版本:2018/9/9-1(10:10)
Hanlder的消息方式来通知HandlerThread来执行一个具体任务 1、HandlerThread是什么?
Hanlder的消息方式来通知HandlerThread来执行一个具体任务2、HandlerThread产生的背景?
3、HandlerThread如何退出?
HandlerThread的run方法是无限循环执行的,需要通过HandlerThread的quit或quitSafely方法来终止线程的执行4、HandlerThread的典型使用场景?
5、HandlerThread的基本使用
/**============================= * 创建并开启HandlerThread *==============================*/ //创建一个线程,线程名字:handler-thread HandlerThread mHandlerThread = new HandlerThread( "handler-thread") ; //开启一个线程 mHandlerThread.start();/**=========================== * 创建Handler并实现具体任务 *============================*/ //在这个线程中创建一个handler对象 Handler handler = new Handler( mHandlerThread.getLooper() ){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作 Log.d( "handler " , "消息: " + msg.what + " 线程: " + Thread.currentThread().getName() ) ; } };/**=========================== * 开启任务的执行 *=============================*/ //在主线程给handler发送消息 handler.sendEmptyMessage(1) ;6、HandlerThread是如何做到一个线程能够一直运行,有新的任务就处理,没有任务就等待?
Looper.loop()进行无限循环。7、handlerThread.getLooper()必须在handlerThread.start()之后调用
isAlive() = true,会导致直接返回null。无法去构造HandlerHandler handler = new Handler(handlerThread.getLooper());// java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference1、HandlerThread的构造方法
// HandlerThread.java public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) { super(name); mPriority = priority; }2、HandlerThread的run()
// HandlerThread.java-线程的run方法 @Override public void run() { // 1、获取到Tid mTid = Process.myTid(); // 2、创建Looper、MessageQueue Looper.prepare(); synchronized (this) { // 3、存储,并唤醒从HandlerThread.getLooper()方法而阻塞的线程 mLooper = Looper.myLooper(); notifyAll(); } // 4、设置线程优先级 Process.setThreadPriority(mPriority); // 5、回调,进行loop前的准备工作。 onLooperPrepared(); // 6、开始loop() Looper.loop(); mTid = -1; } // HandlerThread.java-loop()前的准备工作 protected void onLooperPrepared() { } // HandlerThread.java-获取到该线程的Looper public Looper getLooper() { // 1、不存活,直接返回null if (!isAlive()) { return null; } // 2、在looper创建前,处于阻塞状态。 synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } //@hide: 获取Handler或者用调用者线程的looper创建Handler public Handler getThreadHandler() { if (mHandler == null) { mHandler = new Handler(getLooper()); } return mHandler; }3、HandlerThread如何退出?quit/quit或quitSafely
// 通过Looper的quit和quitSafely进行退出。 public boolean quit() {} public boolean quitSafely() {}4、HandlerThread的Tid有什么用?
// 1、获取到TidmTid = Process.myTid();public int getThreadId() { //2、返回Tid return mTid;}5、为什么run中有notifyAll,getLooper中有wait?
6、为什么要设置线程优先级?为什么能防止内存泄漏和解决数据安全问题?
7、线程优先级设置的两种方法?两种方式的优先级范围?
1-setThreadPriority()进行设置,线程优先级范围-20~19, 从高优先级~低优先级。
android.os.Process.setThreadPriority (intpriority);android.os.Process.setThreadPriority (inttid, int priority);// thread直接设置Thread a = new MyThread("ThreadA");a.setOSPriority(Process.THREAD_PRIORITY_LOWEST);// 19// thread的run方法中进行设置Thread b = new Thread(new Runnable() { @Override public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); }});2-setPriority()设置,线程优先级范围1~10, 从低优先级~高优先级。
java.lang.Thread.setPriority (int priority);// setPriority进行设置Thread a = new MyThread("ThreadA");a.setPriority(Thread.MAX_PRIORITY);// 10158134.html