android线程

Android第十九天

会有一股神秘感。 提交于 2020-04-07 10:53:34
一:进程与线程 进程:进程是程序的一次运行过程。进程是操作系统分配资源和调度的基本单位。 线程:线程是程序的一条执行路径。 一个进程至少包含一个线程。 引入多线程的必要性:多个线程的切换开销小,可以实现并发(宏观上一起执行)执行的效果。 二:实现多线程的方式 1.继承Thread类,复写run()方法。在run()方法里实现线程的操作。 使用start()方法启动线程。 2.实现Runnable接口,复写run()方法。使用start()方法启动线程。 public Thread(Runnable target,String name) 实现Runnable接口实现多线程的好处: 1.可以避免Java的“单继承”缺陷。 2.可以实现资源共享。 三:线程中的常用方法 public Thread(String name) public Thread(Runnable target,String name) 1.getName() 返回该线程的名称。 2.public static Thread currentThread() 返回对当前正在执行的线程对象的引用。 3.public static void sleep(long millis) 线程休眠指定的毫秒数 4.setPriority(int newPriority) 优先级高的不一定先执行。 (不靠谱) 5.public

Android 线程操作之线程池

a 夏天 提交于 2020-04-04 05:09:23
Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。 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提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

Java(Android)线程池妙用

别等时光非礼了梦想. 提交于 2020-04-04 04:01:37
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。 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提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

JAVA 面试须知

这一生的挚爱 提交于 2020-03-30 18:21:31
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺。 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false。这个数据类型表示1 bit的信息,但是它的大小并没有精确定义。 《Java虚拟机规范》中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型单独使用是4个字节,在数组中又是1个字节。那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗?实际上,使用int的原因是,对于当下32位的CPU来说,一次进行32位的数据交换更加高效。 综上,我们可以知道:官方文档对boolean类型没有给出精确的定义,《Java虚拟机规范》给出了“单独时使用4个字节,boolean数组时1个字节”的定义,具体还要看虚拟机实现是否按照规范来

深入浅出Java(Android )线程池ThreadPoolExecutor

血红的双手。 提交于 2020-03-30 15:26:01
前言 关于线程池 在Java/Android开发中,设计到并发的请求,那基本上是离不开线程池了。用线程池的好处: 1、减少线程频繁创建、销毁的开销; 2、好控制并发量,降低OOM的可能,至于原因文中会说; 3、提高程序的响应速度,因为可以省去部分创建的过程; 要不要深度学习线程池 对于服务端的同学来说应该会比较重视这一块,因为需要做高并发;而移动端的同学可能比较容易忽略这一块。有些人觉得平时也用不到,移动端没有那么大并发量,或者说第三方框架中已经完成了,比如 OkHtttp ; 其实只能说有这种想法的同学还没有遇到大一点的项目或者说没有太多多线程优化的经验。 如果你真的遇到了这种项目瓶颈,你连线程池的运行原理都不知道,那又如何解决项目问题呢? 如果你要寻求一份中高级开发工程师的工作,那线程池是基本是必问题目之一,而且还要有一定深度。 如何深度学习线程池 这也是我们今天的重点,本文将从下面几点带大家快速掌握线程池的要点: 1、从API使用到原码解析,基于JDK1.8版本; 2、从源码阅读(深入)中总结出(浅出)线程池工作原理; 3、对应用场景的分析以及异常处理 预览 线程池类图.png 先对线程池的部分核心类/接口做个简介,大家有个印象就好。 Executor接口 public interface Executor { /** * 就一个方法,用来执行线程任务的

android notify() notifyAll()的区别

跟風遠走 提交于 2020-03-28 06:32:20
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。 void notify(): 唤醒一个正在等待该对象的线程。 void notifyAll(): 唤醒所有正在等待该对象的线程。 两者的最大区别在于: notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。 来源: https://www.cnblogs.com/lechance/p/4373225.html

Android HandlerThread 的使用及其Demo

ぃ、小莉子 提交于 2020-03-18 14:06:32
今天我们一起来学习下一个Android中比较简单的类 HandlerThread ,虽然它的初始化有点小麻烦。 介绍 首先我们来看看为什么我们要使用 HandlerThread ?在我们的应用程序当中为了实现同时完成多个任务,所以我们会在应用程序当中创建多个线程。为了让多个线程之间能够方便的通信,我们会使用 Handler 实现线程间的通信。 下面我们看看如何在线程当中实例化 Handler 。在线程中实例化 Handler 我们需要保证线程当中包含Looper( 注意 : UI-Thread默认包含Looper )。 为线程创建Looper的方法如下:在线程run()方法当中先调用Looper.prepare()初始化Looper,然后再run()方法最后调用Looper.loop(),这样我们就在该线程当中创建好Looper。( 注意 : Looper.loop()方法默认是死循环 ) 我们实现Looper有没有更加简单的方法呢?当然有,这就是我们的 HandlerThread 。我们来看下 Android 对 HandlerThread 的描述: Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note

黑马程序员_java多线程总结

[亡魂溺海] 提交于 2020-03-12 05:16:55
android培训 、 java培训 、期待与您交流! /* 多线程技术 java虚拟机允许程序并发地运行多个线程。 JVM启动至少有两个线程,一个是主线程(代码在mian方法中);另一个是负责垃圾回收机制的线程。 创建线程 方法一 在java.lang包中有一个Thread类 继承Thread类 步骤: 1,定义类继承Thread. 2,复写Threa类中的run方法; 目的:将自定义代码存储在run方法中,让线程运行。 3,调用start(),该方法有两个作用,就是启动线程,调用run方法。 */ // 例:三个窗口分别买票,每一个窗口卖10张票 class ThreadDemo extends Thread //定义类继承Thread. { public void run() //复习run方法 { int x=1; while(x<=10) { System.out.println(Thread.currentThread().getName()+"....."+x);//打印正在运行的线程 x++; } } } class Test { public static void main(String[] String) { new ThreadDemo().start();//创建第一个线程并运行 new ThreadDemo().start();//创建第二个线程并运行

android内存优化-Activity, Thread引起的内存泄露0

假装没事ソ 提交于 2020-03-08 20:43:49
Android编程中一个共同的困难就是协调Activity的生命周期和长时间运行的任务(task),并且要避免可能的内存泄露。思考下面Activity的代码,在它启动的时候开启一个线程并循环执行任务。 1 /** 2 * 一个展示线程如何在配置变化中存活下来的例子(配置变化会导致创 3 * 建线程的Activity被销毁)。代码中的Activity泄露了,因为线程被实 4 * 例为一个匿名类实例,它隐式地持有外部Activity实例,因此阻止Activity 5 * 被回收。 6 */ 7 public class MainActivity extends Activity { 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 exampleOne(); 13 } 1415 private void exampleOne() { 16 new Thread() { 17 @Override 18 public void run() { 19 while (true) { 20 SystemClock.sleep(1000); 21 } 22 } 23 }.start(); 24 } 25 } 当配置发生变化

Android线程通信

廉价感情. 提交于 2020-03-08 18:11:38
摘要   andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 正文 图解: 代码示例: /** * @author allin.dev * http://allin.cnblogs.com */ public class MainThread extends Activity { private static final String TAG = "MainThread"; private Handler mMainHandler, mChildHandler; private TextView info; private Button msgBtn; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.main ); info = (TextView) findViewById( R.id.info ); msgBtn = (Button) findViewById( R.id.msgBtn ); mMainHandler = new