mthread

python:threading.Thread类的使用详解

混江龙づ霸主 提交于 2020-05-08 00:49:45
Python Thread类表示在单独的控制线程中运行的活动。有两种方法可以指定这种活动: 1、给构造函数传递回调对象 mthread=threading.Thread(target=xxxx,args=(xxxx)) mthread.start()   2、在子类中重写run() 方法 这里举个小例子: import threading, time class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): global n, lock time.sleep(1) if lock.acquire(): print n , self.name n += 1 lock.release() if "__main__" == __name__: n = 1 ThreadList = [] lock = threading.Lock() for i in range(1, 200): t = MyThread() ThreadList.append(t) for t in ThreadList: t.start() for t in ThreadList: t.join()    派生类中重写了父类threading.Thread的run()方法

Android UI 线程更新UI也会崩溃???

空扰寡人 提交于 2020-04-22 04:54:39
本文已经授权公众号「鸿洋」原创首发。 大家好,我是鸿洋。 上个周末是双休,我决定来颠覆一下大家的认知。 在平时的Android开发中,如果一个新手遇到一个这样的错: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8066) at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1297) at android.view.View.requestLayout(View.java:23147) 你作为一只老鸟,嘴角露出一丝微笑: “小兄弟,你这个是没有在UI线程执行UI操作导致的错误,你搞个UI线程的handler.post一下就好了”。 但是… 我今天要说,真是是只有UI线程才能更新UI吗? 你作为一只老鸟,肯定立马脑子里闪过: 我知道你这文章写啥了,又要在Activity#onCreate,去搞个线程执行TextView#setText,然后发现更新成功了,是不是?

Android UI 线程更新UI也会崩溃???

会有一股神秘感。 提交于 2020-04-20 09:44:49
本文已经授权公众号「鸿洋」原创首发。 大家好,我是鸿洋。 上个周末是双休,我决定来颠覆一下大家的认知。 在平时的Android开发中,如果一个新手遇到一个这样的错: android.view.ViewRootImpl $CalledFromWrongThreadException : Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8066) at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1297) at android.view.View.requestLayout(View.java:23147) 复制代码 你作为一只老鸟,嘴角露出一丝微笑: “小兄弟,你这个是没有在UI线程执行UI操作导致的错误,你搞个UI线程的handler.post一下就好了”。 但是... 我今天要说,真是是只有UI线程才能更新UI吗? 你作为一只老鸟,肯定立马脑子里闪过: 我知道你这文章写啥了,又要在Activity#onCreate,去搞个线程执行TextView#setText,然后发现更新成功了,是不是

音视频直播--深度技术解析

不打扰是莪最后的温柔 提交于 2020-03-17 11:32:44
某厂面试归来,发现自己落伍了!>>> 大家好,今天我为大家讲解一下Android系统下的Handler机制。做过Android系统开发的人都清楚,App应用程序的主线程是决对不能被阻塞的,因为它的主线程就是UI线程。一旦它被阻塞了,用户会感觉APP卡死似的,基本就没法使用了。所以在音视频直播项目中,我们对摄像头的控制,视频画面的渲染都要放在子线程中进行。下面我们就来详细的剖析一下Android系统下的Handler和HandlerThread机制。 常用线程模型 给大家详细介绍handler和handlerthread之前,先给大家讲一下我们在实际工作中都是如何使用线程的。实际工作使用线程时,最大的难点是线程之间通信问题。 线程之间通信有很多方法,如信号量、 管道、 共享内存、共享文件、 消息队列等。 这些方法中用的最多的还是消息队列,围绕着消息队列我们一般有两种线程模型: 第一、创建一个新线程,然后从消息队列中取出一个任务,执行这个任务,完成任务后线程结束。这种模型非常的简单,我称之为“用后即焚” 。但这种模型效率很差,尤其是频烦的开关线程会消耗大量CPU资源。解决办法是创建一个线程池,每次从线程池中获取新线程,当线程执行完任务后将线程放回线程池以便线程的重复利用。 第二、创建一个新的线程,在该线程中执行一个死循环函数,不停的从消息队列中取出消息进行处理。

Android 中的C++线程Thread及它的threadLoop方法

北城余情 提交于 2020-03-14 20:00:50
在Android Framework中的代码看见了许许多多的Thread。它们普遍的特点就是有一个threadLoop方法。按照字面的意思应该是这个线程能够循环处理数据。对应我想到到了java上层中的HandlerThread,这个估计也差不多,想弄清楚它为什么能够循环,还有它到底是怎么循环起来的? Android中java世界的Thread 我们先来看看java是怎么创建一个线程的。这个是最舒服的,也是我最熟悉的。 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub ... } }).start(); 当然,你也可以在android中创建一个消息循环的HandlerThread HandlerThread mThread = new HandlerThread("test"); mThread.start(); Handler mHandler = new Handler(mThread.getLooper()){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); } };

只需5分钟,手把手带你了解Handler错误使用场景

巧了我就是萌 提交于 2019-12-12 10:41:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Hander,Looper,MessageQueue,Message的全程协作的关系就好比一个餐厅的整体运作关系: Handler —— 点餐员 Looper —— 后厨厨师长。 MessageQueue —— 订单打单机。 Message —— 一桌一桌的订单。 接下来我们回顾下我们餐厅点餐的场景,餐厅点餐分为标准点餐和特殊点餐,我们分解来看。 标准流程 首先进入一家店,通过点餐员点餐把数据提交到后厨打单机。 然后厨师长一张一张的拿起订单,按照点餐的先后顺序,交代后厨的厨师开始制作。 制作好后上菜,并标记已做好的订单。 特殊流程 订单为延迟订单,比如客人要求30分钟后人齐了再制作,这时会把该订单按时间排序放到订单队列的合适位置,并通过SystemClock.uptimeMillis()定好闹铃。至于为什么用uptimeMillis是因为该时间是系统启动开始计算的毫秒时间,不受手动调控时间的影响。 如果打单机中全是延迟订单,则下令给后厨厨师休息,并在门口贴上免打扰的牌子(needWake),等待闹铃提醒,如有新的即时订单进来并且发现有免打扰的牌子,则通过nativeWake()唤醒厨师再开始制作上菜。 但是为了提升店铺菜品覆盖,很多相邻的店铺都选择合作经营,就是你可以混搭旁边店的餐到本店吃

Android Handler理解

北城余情 提交于 2019-12-05 03:58:05
Handler是什么 Handler是Android 线程间通信工具类。 一般用于子线程向主线程发送消息,将子线程中执行结果通知主线程,从而在主线程中执行UI更新操作。 源码角度理解 Handler负责发送(sendMessage)和处理消息(handleMessage) 1)Message:消息载体,包含消息id(what)、消息处理对象(obj)、Runnable接口等。Handler发送一条消息后,会将该消息加入到MessageQueue统一消息处理队列中。 2)MessageQueue:消息队列。用来存放Handler发送的消息的队列,单链表实现 3)Looper:消息泵,通过Looper.loop( )创建一个死循环,不断地从MessageQueue中抽取Message,Message通过绑定的内部target(handler类型),msg.target.dispatchMessage(msg)将该消息传给对应的Handler接收。在dispatchMessage方法内调用handleCallback或handleMessage方法 ThreadLocal理解 创建Handler对象时,需要先为这个Handler创建Looper.prepara( )新建一个looper对象。一个线程中只会有一个looper。因为looper使用ThreadLocal.set方法