android线程

cocos2dx Jni调用需要线程切换 ui线程和GL线程

匿名 (未验证) 提交于 2019-12-03 00:42:01
cocos2d-x for Android 运行在多线程环境下,所以在 Lua/C++ 和 Java 交互时需要注意选择适当的线程。 cocos2d-x 在 Android 上以两个线程来运行,分别是负责图像渲染的 GL 线程和负责 Android 系统用户界面的 UI 线程。 在 cocos2d-x 启动后,Lua/C++代码将由 GL 线程调用,因此从 Lua/C++中调用的 Java 方法如果涉及到系统用户界面的显示、更新操作,那么就必须让这部分代码切换到 UI 线程上去运行。 反之亦然,从 Java 调用 Lua/C++代码时,需要让这个调用在 GL 线程上执行,否则 Lua/C++代码虽然执行了,但会无法更新 cocos2d-x 内部状态。 简单说说,我相信每个人做Android的都知道的更新UI只能在UI线程进行刷新,这是一个非常霸道的条款 Cocos2dx基于opengl es 实现跨平台工程 Android程序在启动的时候,首先加载了我们的MainActivity,这个时候Java加载了c++平台编译的.so文件。然后我们在根据Activity的声明周期走起来~ public void init() { 主要基于GLSurfaceView,将GLSurfaceView添加到我们的视图中

android在工作线程中处理UI线程报错:Only the original thread that created a view hierarchy can touch its views.

匿名 (未验证) 提交于 2019-12-03 00:19:01
我们在Android开发过程中,经常会遇到这个问题,因为:Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,只能通过异步方式来实现。 实现方式有多种,我这边常用的有以下两种: 1、使用Handler消息传递机制。(这个非常经典) 2、使用AsyncTask异步任务。 1、使用Handler消息传递机制,代码如下: import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; //创建handler Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if(msg.what==0) //如果消息是刚才发送的标识 { tv.setText("接收到handler发过来的消息进行UI更新"); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super

并发编程之线程共享和协作(一)

匿名 (未验证) 提交于 2019-12-03 00:17:01
更多Android架构进阶视频学习请点击: https://space.bilibili.com/474380680 本篇文章将从以下几个内容来阐述线程共享和协作: [基础概念之CPU核心数、线程数,时间片轮转机制解读] [线程之间的共享] [线程间的协作] 一、基础概念 CPU核心数、线程数 两者的关系:cpu的核心数与线程数是1:1的关系,例如一个8核的cpu,支持8个线程同时运行。但在intel引入超线程技术以后,cpu与线程数的关系就变成了1:2。此外在开发过程中并没感觉到线程的限制,那是因为cpu时间片轮转机制(RR调度)的算法的作用。什么是cpu时间片轮转机制看下面1.2. CPU时间片轮转机制 含义就是:cpu给每个进程分配一个“时间段”,这个时间段就叫做这个进程的“时间片”,这个时间片就是这个进程允许运行的时间,如果当这个进程的时间片段结束,操作系统就会把分配给这个进程的cpu剥夺,分配给另外一个进程。如果进程在时间片还没结束的情况下阻塞了,或者说进程跑完了,cpu就会进行切换。cpu在两个进程之间的切换称为“上下文切换”,上下文切换是需要时间的,大约需要花费5000~20000(5毫秒到20毫秒,这个花费的时间是由操作系统决定)个时钟周期,尽管我们平时感觉不到。所以在开发过程中要注意上下文切换(两个进程之间的切换)对我们程序性能的影响。 二、 线程之间的共享

第11章 Android的线程和线程池

匿名 (未验证) 提交于 2019-12-02 23:55:01
除了Thread以外,在Android中可以扮演线程的角色还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。 AsyncTask封装了线程池和Handler。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一种服务,不容易被系统杀死从而可以尽量保证任务的执行,如果是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会降低,容易被系统杀死,这就是IntentService的优点。 从Android3.0开始系统要求网络访问必须在子线程执行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常。 11.2.1 AsyncTask AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 4个核心方法: onPreExecute() doInBackground(Params… params)在此方法中可以通过publishProgress方法来更新任务进度

Java 四种线程池的用法分析

扶醉桌前 提交于 2019-12-02 19:56:37
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用,本文是基础篇。 转载请标注原地址 : http://blog.csdn.net/u011974987/article/details/51027795 ; 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread( new Runnable() { @Override public void run () { // TODO Auto-generated method stub } } ).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。 相比new Thread,Java提供的四种线程池的好处在于: a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c. 提供定时执行、定期执行、单线程、并发数控制等功能。 2、Java 线程池 Java通过Executors提供四种线程池,分别为:

关于线程池的执行原则及配置参数详解

孤街醉人 提交于 2019-12-02 19:50:42
作者博客地址: http://gudong.name 本文博客地址: http://gudong.name/2017/05/03/thread-pool-intro.html 池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能。Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生成线程池,通过 Executors 可以方便的生成不同类型的线程池。但是要更好的理解使用线程池,就需要了解线程池的配置参数意义以及线程池的具体工作机制。 下面先介绍一下线程池的好处以及创建方式,接着会着重介绍关于线程池的执行原则以及构造方法的参数详解。 线程池的好处 引用自 http://ifeve.com/java-threadpool/ 的说明: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 创建线程池 //参数初始化 private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

线程池(ThreadPoolExecutor)处理异步任务

久未见 提交于 2019-12-02 19:31:10
转载于: http://blog.csdn.net/u010687392/article/details/49850803 1.前言 我们在开发时候或多或少都会用到线程,而通常创建线程有两种方式: 继承Thread类 实现Runnable接口 这两种方式虽然都可以创建线程,但是是有区别的: 主要区别在于在多线程访问同一资源的情况下,用Runnable接口创建的线程可以处理同一资源,而用Thread类创建的线程则各自独立处理,各自拥有自己的资源,这样不利于资源共享。 用Thread类创建是继承的方式,而用Runnable接口创建是实现接口的方式,更灵活多样性。 所以, 在Java中大多数多线程程序都是通过实现Runnable来完成的,而对于Android来说也不例外。 具体实现代码如下: new Thread( new Runnable() { @Override public void run () { //TODO. } }).start(); 上述代码创建了一个线程并执行,它在 任务结束后GC会自动回收该线程 ,这种处理在线程并发不多的程序中确实不错,但是当程序有很多地方需要开启大量线程来处理任务,那么如果还是用上述的方式去创建线程处理的话,那么将导致系统的性能表现的非常糟糕,更别说在内存有限的移动设备上,主要的影响如下: 线程的创建和销毁都需要时间,当有大量的线程创建和销毁时

Java 线程池详解及实例代码

拈花ヽ惹草 提交于 2019-12-02 18:49:05
转载自 Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。 所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些”池化资源”技术产生的原因。 例如Android中常见到的很多通用组件一般都离不开”池”的概念,如各种图片加载库,网络请求库,即使Android的消息传递机制中的Meaasge当使用Meaasge.obtain()就是使用的Meaasge池中的对象,因此这个概念很重要。本文将介绍的线程池技术同样符合这一思想。 线程池的优点: 1.重用线程池中的线程,减少因对象创建,销毁所带来的性能开销; 2.能有效的控制线程的最大并发数,提高系统资源利用率,同时避免过多的资源竞争,避免堵塞; 3.能够多线程进行简单的管理,使线程的使用简单、高效。 线程池框架Executor java中的线程池是通过Executor框架实现的,Executor 框架包括类:Executor,Executors

线程、多线程与线程池基础

我的梦境 提交于 2019-12-02 18:32:36
先看几个概念: 线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。 多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。 线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。 如果对线程概念不清晰的话,不妨先看看 我是一个线程 这篇文章,拟人化的故事阐述线程的工作原理。 ● 线程 创建线程的两种方式: 一、继承Thread类,扩展线程。 class DemoThread extends Thread { @Override public void run () { super .run(); // Perform time-consuming operation... } } DemoThread t = new DemoThread(); t.start(); 继承Thread类,覆盖run()方法。 创建线程对象并用start()方法启动线程。 面试题 1)线程和进程有什么区别? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用

android APP ANR 出现的原因汇总

限于喜欢 提交于 2019-12-02 18:31:15
ANR出现的原因汇总如下: 1.主线程执行了耗时操作,比如数据库操作或网络编程 2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。 细分的话,导致ANR的原因有如下几点: 1.耗时的网络访问 2.大量的数据读写 3.数据库操作 4.硬件操作(比如camera) 5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候 6.service binder的数量达到上限 7.system server中发生WatchDog ANR 8.service忙导致超时无响应 9.其他线程持有锁,导致主线程等待超时 10.其它线程终止或崩溃导致主线程一直等待 转自:https://www.jianshu.com/p/7fd95bc2a55c 来源: https://www.cnblogs.com/mncasey/p/11757837.html