线程

Android handler机制流程详解

六眼飞鱼酱① 提交于 2020-03-04 06:39:53
Android handler机制流程详解 handler机制由以下几部分组成: .Handler .Message .MessageQueue .Looper 总体流程介绍: 一、进程启动时 在main方法中为主线程创建了对应自己线程的Looper,在Looper被创建的同时会创建一个MessageQueue消息队列并持有。同时在main方法中调用了Looper.loop()进行一个死循环遍历Looper自己持有的消息队列。 二、创建handler 如果在主线程中创建,handler能获取到主线程对应的looper并持有。如果是在子线程中创建handler,则需要自己调用创建looper方法和自己调用Looper.loop。否则会报错。 三、创建Message并发送 创建的Message将创建自己的handler信息封装进Message内部,最终被发送到了MessageQueue消息队列中。 四、接收消息 在Looper.loop中,从MessageQueue中拿出Message,并根据其中对应的handler信息进行分发处理 对应关系: 一条线程Thread对应唯一的一个Looper,其对应相关的信息存储在ThreadLocal中。 一个Looper对象持有一个自己的MessageQueue。 在同一条线程中,无论创建多少handler

java 多线程(二)

江枫思渺然 提交于 2020-03-04 05:51:47
一、 线程 1.1多线程原理 我的java多线程(一)的那一篇博客中已经写过多线程的代码,但是很多人对原理不是很清楚,那么我们通过代码再来体现一下多线程程序。 代码如下: 自定义线程类: public class MyThread extends Thread { /* *利用继承中的特点 *将线程名称传递 进行设置 */ public MyThread ( String name ) { super ( name ) ; } /* *重写run方法 *定义线程要执行的代码 */ public void run ( ) { for ( int i = 0 ; i < 20 ; i ++ ) { //getName()方法来自父类 System . out . println ( getName ( ) + i ) ; } } } 测试类: ```java public class Demo { public static void main(String[] args) { System.out.println(“这里是main线程”); MyThread mt = new MyThread(“小强”); mt.start();//开启了一个新的线程 for (int i = 0; i < 20; i++) { System.out.println(“旺财:”+i); } } }

一文弄懂JavaScript事件循环Event Loop

别说谁变了你拦得住时间么 提交于 2020-03-04 05:15:12
单线程 我们知道JavaScript是一门单线程语言,一个页面所有的JavaScript代码都是一行一行的执行,如果中间出现错误,那么下面的代码就不会执行,就行 alert() 一样,如果没有点击确定,alert下面的代码就不会执行。JavaScript单线程也符合了页面的交互逻辑,不能对同一个DOM元素进行同时更改。 任务队列 任务可以分为 同步任务 和 异步任务 同步任务:在主线程上排队执行的任务;同步就是按照一步一步的去执行,只有任务被执行完,才进行下一步。举个例子,烧水和切菜,你要等水烧开了再切菜。 异步任务:不进入主线程,而进入任务队列的任务,只有等主线程执行完,得到通知才会进入主线程执行;异步就是在执行的过程中可以去干别的事,举个例子,烧水和切菜,你可以一边烧水,一边切菜。 执行流程 执行时会把所有同步任务全部压入主线程执行,异步任务会注册函数,然后进入事件队列,等到主线程为空时,也就是同步任务执行完的时候才会执行事件队列里的; Event Loop 前面说过 JavaScript 是单线程的,它是如何去处理这些异步任务和事件呢?主线程执行的时候,当它发现一个异步任务时,会将该任务放入一个任务队列中,当主线程完成当前任务后,才会从任务队列中获取新任务一个一个执行。当然任务队列分两种: 宏任务:整体JavaScript代码, setTimeout ,

Java常见面试题

你说的曾经没有我的故事 提交于 2020-03-04 04:24:06
Java开发岗位面试常问题 一、Java基础 1、String类为什么是final的. 2、HashMap的源码,实现原理,底层结构. 3、说说你知道的几个Java集合类:list、set、queue、map实现类咯... 4、描述一下ArrayList和LinkedList各自实现和区别 5、Java中的队列都有哪些,有什么区别. 6、反射中,Class.forName和classloader的区别 7、Java7、Java8的新特性(baidu问的,好BT) 8、Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高 9、Java内存泄露的问题调查定位:jmap,jstack的使用等等 10、string、stringbuilder、stringbuffer区别 11、hashtable和hashmap的区别 13、异常的结构,运行时异常和非运行时异常,各举个例子 14、String a= "abc" String b = "abc" String c = new String("abc") String d = "ab" + "c" .他们之间用 == 比较的结果 15、String 类的常用方法 16、Java 的引用类型有哪几种 17、抽象类和接口的区别 18、java的基础类型和字节大小. 19

JAVA JUC

非 Y 不嫁゛ 提交于 2020-03-04 03:55:54
文章目录 JAVA JUC 一、Volatile 关键字-内存可见性 1、java线程的6种状态Thread.state: 2、JAVA多线程:判断 干活 改标志位加唤醒通知(详见Thread.start()方法) 3.一共两个线程 (1)同步锁:synchronized关键字,使两个线程同步 (2)Volatile关键字 (3)Volatile与Scnchronized比较 二、原子变量与CAS算法 1、i ++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” 2、原子变量:JDK1.5以后 java.util.concurrent.atomic 包下提供了常用的原子变量 (1)原子变量特性 (2)原子性的解决过程:(先读取内存值,再进行比较,再进行赋值和写入) (3)原子变量的使用: 三、模拟CAS算法 四、ConcurrentHashMap锁分段机制 1、hashmap和hashtable区别: 2、ConCurrentHashMap采用“锁分段”机制 3、CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” 4、CountDownLatch(==闭锁==,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行) 四、创建执行线程的方式三:实现Callable接口 五、Lock同步锁 1

JVM 内存结构模型

南楼画角 提交于 2020-03-04 03:32:44
文章目录 JVM 内存结构模型 JVM 内存区域 程序计数器 PC 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 JAVA8 与元空间 执行引擎 JVM 内存结构模型 JVM 虚拟机主要由 4 个部分组成: Class Loader: 依据特定的格式,将 class 文件加载到内存 Execution Engine: 解析字节码文件并提交给操作系统执行 Native Interface: Java 本地接口,融合不同语言开发的原生库为 Java 所用 Runtime Data Area: JVM 内存结构模型 JVM 内存区域 线程私有 程序计数器 PC、虚拟机栈、本地方法栈 线程共享 方法区、堆、直接内存(非运行时数据区) 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内) ,每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。 线程共享区域随虚拟机的启动/关闭而创建/销毁 直接内存并不是 JVM 运行时数据区的一部分 ,但也会被频繁的使用:在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式,它可以使用 Native 函数库直接分配堆外内存,然后使用 DirectByteBuffer 对象作为这块内存的引用进行操作,这样就避免了在

线程(一)

邮差的信 提交于 2020-03-04 01:37:09
Java 程序的运行原理 : 由 Java 命令启动 JVM , JVM 启动就相当于启动了一个进程, 接着由该进程创建了一个主线程去调用 main 方法 jvm 虚拟机的启动是单线程的还是多线程的? 多线程的 ; 原因是垃圾回收线程也要先启动,否则很容易出现内存溢出; 现在的垃圾回收线程加上前面的主线程,最低启动了两个线程,所以, jvm 的启动其实是多线程的 并行和并发 前者是逻辑上同时发生,指在某一个时间内同时运行多个程序; 后者是物理上同时发生,指在某一个时间点同时运行多个程序 public class MyThread extends Thread { @Override public void run () { for ( int x = 0 ; x < 500 ; x++) { System. out .println(getName() + " " + x) ; } } } public class MyThreadDemo { public static void main (String[] args) { // 创建线程对象 // 调用 run() 方法为什么是单线程呢? // 因为 run() 方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果 // 面试题 :run() 和 start() 的区别? //run():

Day 22多线程、线程通信、线程池和Lambda表达式

ⅰ亾dé卋堺 提交于 2020-03-04 01:18:39
Day 22 Author:ScorpioDong 1. 多线程 1.1 WAITING(无限等待) 当某一线程被执行wait()方法,需要等待其他线程进行唤醒操作。 public void wait(); 当前线程进入无线等待状态 开启锁对象 public void notify(); 唤醒一个当前锁对象有关的无线等待线程,随机选择 开启锁对象 public void notifyAll(); 唤醒所有和当前锁对象有关的线程 开启锁对象 进入锁对象抢占过程,有可能进入锁阻塞状态 2. 线程通信 现在存在两个完全无关的线程,生产者和消费者,但是商品会作为他们两者之间的共享资源。 生产者和消费者中都有一个成员变量 商品类型 【解决方案】 创建生产者或者消费者线程对象时,使用同一个商品类对象,作为构造方法参数进行初始化操作 3. 线程池 不管是继承Thread还是遵从Runnable接口,都需要重写Run方法,而且每一个线程对象有且只能执行一次,之后就会被销毁。 利用Runnable接口来提供执行目标,而且借助于Thread执行线程。 线程池 ==> 可以容纳多个线程的容器 程序可以从线程池获取线程来完成目标代码 同时也可以将线程归还给线程池。 省去了创建线程和销毁线程这样非常繁琐的操作。 线程池使用: public static ExecutorService

Java 并发 总结

空扰寡人 提交于 2020-03-03 22:33:42
转编自: https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Thread 控制策略 直接控制线程 交给 Executor 管理线程 线程启动 实现 Runnable 接口run 方法,调用 new Thread(Runnable).start() 运行线程;灵活,可以继承其他类 继承 Thread 类,覆盖 run 方法;不可继承其他类,不灵活 Thread.sleep(time) 暂停当前方法的运行,进入睡眠状态,让出CPU资源,此方法会抛出 InterruptException。 Thread.interrupt() 打断线程的运行状态。Thread 类有一个状态量 status ,用来表明当前线程的打断状态。 调用静态方法 Thread.interrupted() 返回 status 会重置 status ; 调用实例方法 thread.isInterrupted() 直接返回 status 状态。 thread.join() 等待线程实例结束运行。可以指定等待时间,会抛出 InterruptedExection. synchronized (同步) 目的 多线程运行可以提高程序的运行效率。但线程运行的时候访问同一个资源,那么会影响对资源的使用。

Java多线程与JUC——01理解进程线程的概念

青春壹個敷衍的年華 提交于 2020-03-03 22:15:36
今天开始认真的学一下Java线程与JUC,所以开辟一个新的专栏来记录笔记。希望也能对你的学习有所帮助,喜欢的话就多多关注我吧。我会一直将我的笔记传到我的博客上与大家分享交流。 1.进程 几乎所有的操作系统都支持进程概念,进程是处于运行过程中的程序, 进程是操作系统中进行资源分配的基本单位。 一般而言进程包含如下三个基本特征 。 独立性 :指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。没有进程本身的同意,其他进程是不能访问到该进程所有的地址空间。 动态性 :进程与程序的区别在于, 程序只是一个静态的指令集合 ,而 进程是一个正在系统中活动的指令集合 。在进程中加入了时间的概念。进程具有自己的生平周期和各种不同的状态,这些概念在程序中都是不具备的。 并发性 :多个进程可以在单个处理器上并发执行。 并发性与并行性的区别 并行性 :指在同一时刻,有多条指令在多个处理器上同时执行; 并发性 :指在同一时刻只能有一条指令执行。但 多个进程指令被快速轮换执行 ,使得宏观上具有多个进程同时执行的效果。 进程是状态 2.线程 线程则扩展了进程的概念,使得同一个进程可以同时并发出多个任务 线程是进程的执行单元,是进程的组成部分,一个进程可以拥有多个线程,每个线程必须有一个父进程。 线程是独立运行的