本地线程

NO.2 Android 线程间交互

社会主义新天地 提交于 2020-03-01 10:05:14
NO.2 Android 线程间交互 零蚀 线程的终止 一个线程终止另一个线程 Thread thread = new Thread ( new Runnable ( ) { @Override public void run ( ) { } } ) ; thread . start ( ) ; thread . stop ( ) ; 线程里 有一个非常有效的终止线程的方法,可以使用stop来有效的结束一个线程,但是这个api在4.1的时候就已经被弃用了,因为结果是不可预期的,当结束线程时候,不能了解到线程所做的工作是什么,所以对这种不可控的因素,是不可靠的。 Thread thread = new Thread ( ) { @Override public void run ( ) { //重置interrupt的状态 if ( Thread . interrupted ( ) ) { // 收尾 return ; } // 下面的方法不会改变interrupt标记的状态 //if(isInterrupted()){ // return; //} } } ; thread . start ( ) ; thread . interrupt ( ) ; interrupt方法并非像stop即死,它是给这个线程做个中断标记。通知线程将被中断。如果线程在合适的位置进行终止,如上述代码。

Windows线程+进程通信

丶灬走出姿态 提交于 2020-03-01 08:15:48
一 Windows线程进程 1)定义 按照MS的定义, Windows中的进程简单地说就是一个内存中的可执行程序, 提供程序运行的各种资源. 进程拥有虚拟的地址空间, 可执行代码, 数据, 对象句柄集, 环境变量, 基础优先级, 以及最大最小工作集. Windows中的线程是系统处理机调度的基本单位. 线程可以执行进程中的任意代码, 包括正在被其他线程执行的代码. 进程中的所有线程共享进程的虚拟地址空间和系统资源. 每个线程拥有自己的例外处理过程, 一个调度优先级以及线程上下文数据结构. 线程上下文数据结构包含寄存器值, 核心堆栈, 用户堆栈和线程环境块. 2) 如下图: 3)线程与进程的关系 线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。 在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。 4) 进程和线程的区别   (1)、进程是资源管理的基本单位,它拥有自己的地址空间和各种资源,例如内存空间、外部设备;线程只是处理机调度的基本单位,它只和其他线程一起共享资源,但自己没有任何资源。   (2)、以进程为单位进行处理机切换和调度时,由于涉及到资源转移以及现场保护等问题,将导致处理机切换时间变长,资源利用率降低

图示JVM工作原理

淺唱寂寞╮ 提交于 2020-03-01 04:05:24
JDK,JRE,JVM的联系是啥? 不格网 m.vbuge.com JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言无关性和平台无关性。 语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。 平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器

Java并发编程--2.synchronized

六眼飞鱼酱① 提交于 2020-03-01 03:14:54
前言 synchronized关键字是互斥锁,也称为内部锁 每个对象都有自己的monitor(锁标记),它是为了分配给线程,最多一个线程可以拥有对象的锁 使用 synchronized修饰成员方法,锁的是当前实例对象 下面是一个例子: class Thread2 implements Runnable{ private int count; //修饰成员方法,锁的是调用它的对象,该例中也即是调用它的线程 public synchronized void run() { for (int i = 0; i < 5; i ++) { try { System.out.println(Thread.currentThread().getName() + ":" + (count++)); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } 调用: Thread2 t2 = new Thread2(); new Thread(t2).start(); new Thread(t2).start(); synchronized修饰静态方法,锁的是该类的Class对象 下面是一个例子: class Thread3 implements Runnable { private

刨根问底-ThreadLocal线程安全

孤人 提交于 2020-02-29 09:17:30
1、线程安全,值得是在多线程环境先,一个类在执行某个方法时,对类的内部实例变量的访问时安全的。因此,对于下面列出来的2类变量,不存在任何线程安全的说法: (1)方法签名中的任何参数变量 (2)处于方法内部的局部变量 线程安全针对于类内部的全局变量 2、java.lang.ThreadLocal类是jdk提供一种解决多线程并发问题方案。 ThreadLocal类在维护变量时,实际使用了当前线程Thread中的一个叫做ThreadLocalMap的独立副本,每个线程可以独立修改属于自己的副本而不会相互影响,从而隔离了线程和线程,避免了线程访问实例变量发生冲突的问题。 TreadLocal本身并不是一个线程,而是通过操作当前线程中的一个内部变量来达到与其他线程隔离的目的。之所以叫TdreadLocal,表示了其操作的对象时线程的一个本地变量。 现在看Thread代码: public class Thread implements Runnable { ThreadLocal.ThreadLocalMap threadLocals = null; } ThreadLocalMap跟随者当前的线程而存在。不用的线程Thread,拥有不同的ThreadLocalMap的本地实例变量,这就是副本的含义。 ThreadLocal是如何操作ThreadLocalMAP的 : public class

深入研究java.lang.ThreadLocal类

我的梦境 提交于 2020-02-29 08:45:26
一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。 概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问

Jprofile解析dump文件使用详解

ⅰ亾dé卋堺 提交于 2020-02-29 06:36:02
1 Jprofile简介 官网 下载对应的系统版本即可 性能查看工具JProfiler,可用于查看java执行效率,查看线程状态,查看内存占用与内存对象,还可以分析dump日志. 2 功能简介 选择attach to a locally running jvm 选择需要查看运行的jvm,双击或者点击start 等待进度完成,弹出模式选择 Instrumentation模式记录所有的信息。包括方法执行次数等Sampling模式则只支持部分功能,不纪录方法调用次数等,并且更为安全 由于纪录信息很多,java运行会变的比正常执行慢很多,sampling模式则不会 常规使用选择sampling模式即可,当需要调查方法执行次数才需要选择Instrumentation模式,模式切换需要重启jprofiler 点击OK 选择Live Momory可以查看内存中的对象和大小 选择cpu views点击下图框中的按钮来纪录cpu的执行时间 这时候可以在外部对需要录的jvm操作进行记录了,得出的结果可以轻松看出方法执行调用过程与消耗时间比例: 根据cpu截图的信息,可以找到效率低的地方进行处理,如果是Instrumentation模式则在时间位置会显示调用次数 在Thread界面则可以实时查看线程运行状态,黄色的是wait 红色是block 绿色的是runnable蓝色是网络和I/O请求状态

CAS你知道吗?

百般思念 提交于 2020-02-28 23:49:24
CAS 是什么??? 1、比较并交换(CompareAndSet)通过简单的Demo来看 package com . brian . interview . study . thread ; /** * Copyright (c) 2020 ZJU All Rights Reserved * <p> * Project: JavaSomeDemo * Package: com.brian.interview.study.thread * Version: 1.0 * <p> * Created by Brian on 2020/2/11 0:47 */ import java . util . concurrent . atomic . AtomicInteger ; /** * 1、 CAS是什么? ===> CompareAndSet * 比较并交换 */ public class CASDemo { public static void main ( String [ ] args ) { AtomicInteger atomicInteger = new AtomicInteger ( 5 ) ; // main do thing ...... System . out . println ( atomicInteger . compareAndSet ( 5 , 2020

Java多线程和并发基础面试题

懵懂的女人 提交于 2020-02-28 23:06:41
本文帮助大家掌握Java多线程基础知识来对应日后碰到的问题,具体内容如下 一、Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。 3. 用户线程和守护线程有什么区别? 当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。 4. 我们如何创建一个线程? 有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类

CAS原理分析及ABA问题详解

空扰寡人 提交于 2020-02-28 20:36:54
什么是CAS CAS 即 Compare And Swap 的缩写,翻译成中文就是 比较并交换 ,其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS是 原子性 的操作(读和写两者同时具有原子性),其实现方式是通过借助 C/C++ 调用CPU指令完成的,所以效率很高。 CAS 的原理很简单,这里使用一段 Java 代码来描述 public boolean compareAndSwap(int value, int expect, int update) { // 如果内存中的值value和期望值expect一样 则将值更新为新值update if (value == expect) { value = update; return true; } else { return false; } } 大致过程是将内存中的值、我们的期望值、新值交给CPU进行运算,如果内存中的值和我们的期望值相同则将值更新为新值,否则不做任何操作。这个过程是在CPU中完成的,这里不好描述CPU的工作过程,就拿Java代码来描述了。 Unsafe源码分析 Java是在 Unsafe(sun.misc.Unsafe) 类实现 CAS 的操作,而我们知道Java是无法直接访问操作系统底层的API的