本地线程

Java多线程系列---“基础篇”03之 Thread中start()和run()的区别

浪尽此生 提交于 2020-02-18 09:07:10
转自:https://www.cnblogs.com/skywang12345/p/3479083.html (含部分修改) 概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答。本章内容包括: start() 和 run()的区别说明 start() 和 run()的区别示例 start() 和 run()相关源码(基于JDK1.7.0_40) 一. start() 和 run()的区别说明 start() : 它的作用是 启动一个新线程 ,新线程会执行相应的run()方法。 start()不能被重复调用 (否则抛出异常)。 Mynote:runnable没有start方法。要启动,必须要start方法,因此runnable构造方法中需要和Thread来进行绑定。 run() : run()就和普通的成员方法一样, 可以被重复调用 。单独调用run()的话, 会在当前线程中执行run(), 而并 不会启动新线程 ! 下面以代码来进行说明。 class MyThread extends Thread{ public void run(){ ... } }; MyThread mythread = new MyThread(); mythread.start()会启动一个新线程,并在新线程中运行run()方法。 而mythread.run(

java多线程系类:基础篇:03Thread中的start()和run()的区别

本秂侑毒 提交于 2020-02-18 09:06:37
这个系类的内容全部来源于http://www.cnblogs.com/skywang12345/p/3479024.html。特别在此声明!!! 概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答。本章内容包括: start() 和 run()的区别说明 start() 和 run()的区别示例 start() 和 run()相关源码(基于JDK1.7.0_40) 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3479083.html start() 和 run()的区别说明 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。 run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明。 class MyThread extends Thread{ public void run(){ ... } }; MyThread mythread = new MyThread(); mythread.start()会启动一个新线程,并在新线程中运行run()方法。 而mythread.run()则会直接在当前线程中运行run()方法

JVM和JMM内存模型

别说谁变了你拦得住时间么 提交于 2020-02-17 21:51:56
JVM内存模型 JVM内存模型主要指运行时的数据。 线程独占 栈(Stack) 栈,也叫方法栈。 线程私有的。 线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。 调用方法时执行入栈,方法返回时执行出栈。 本地方法栈(Native Method Stack) 与栈类似,native方法使用本地方法栈。 程序计数器(Program Counter) 每个线程工作时都有一个独立的计数器,保存着当前线程所执行的字节码位置。 线程共享 堆(Heap) 线程共享。 存放对象实例。 方法区(Method Area) 也叫非堆区。 存放虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 JDK1.7 永久代和JDK1.8 Metaspace都是方法区的实现。 JMM内存模型 主内存、线程自己的工作内存 原子性 基本数据读写,如 int a = 10; synchronized 关键字 可见性 volatile 关键字(强制内存同步保证不同的线程总是能够看到该变量的最新值,阻止指令重排序) synchronized 关键字 有序性 volatile 关键字(强制内存同步保证不同的线程总是能够看到该变量的最新值,阻止指令重排序) synchronized 关键字 happens-before规则 程序顺序规则

python-多线程(原理篇)

核能气质少年 提交于 2020-02-17 15:37:07
/*--> */ /*--> */ 多线程的基本概念 语言学习总是绕不过一些东西,例如多进程和多线程,最近越来越发现,上来看几个实例练习一下过几天就不知其所以然了。所以还是先看看原理,在看实例练习吧! 线程的概念 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。其实平时我们启动程序,其实是启动的进程,但是在往下细分的话,其实是进程的一个或者多个线程完成的功能。 好处 :(1)易于调度。 (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 (3)开销少。创建线程比创建进程要快,所需开销很少。 (4)利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。 多线程vs多进程 操作系统会为每个进程分配不同的内存块,而多个线程共享进程的内存块。这带来最直接的不同就是创建线程的开销远小于创建进程的开销。 同时,由于内存块不同,所以进程之间的通信相对困难。而线程间的通信简单快速,就是共享进程内的全局变量。 但是,进程的调度由操作系统负责

jvm系列(1):JVM问答

感情迁移 提交于 2020-02-17 06:37:12
一:JVM基础知识 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 答:我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。 而这个过程,我们编写的 Java 程序没有做任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的。 2)什么是 JVM ? 解析:不仅仅是基本概念,还有 JVM 的作用。 答:JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。 3)JVM 由哪些部分组成? 解析:这是对 JVM 体系结构的考察 答:JVM 的结构基本上由 4 部分组成: 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到

interrupt、interrupted 、isInterrupted 区别

旧巷老猫 提交于 2020-02-17 05:29:05
interrupt、interrupted 、isInterrupted 区别 参考链接: https://blog.csdn.net/z69183787/article/details/25076033 https://blog.csdn.net/zhuyong7/article/details/80852884 《并发编程的艺术》 1、 interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为 "中断"状态 。 注意: 线程中断仅仅是设置线程中一个boolean类型的标志符为True,意味着为中断状态(该字段并不是Thread类的字段,并且标志该字段的方法是native方法),并不会停止线程。需要用户自己去监视线程的状态为并做处理。 支持线程中断的方法,如wait、sleep、join(中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,该线程会立即被唤醒,并抛出中断异常。 从Java的API中可以看到,许多声明抛出InterruptedException的方法(例如Thread.sleep(longmillis)方法)这些方法在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException

ThreadLocal

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-17 05:27:50
父线程生成的变量需要传递到子线程中进行使用 引入阿里提供的技术:TransmittableThreadLocal 解决线程本地变量在线程池之间的传递问题 github地址: https://github.com/alibaba/transmittable-thread-local 例1: 来源: CSDN 作者: 这些不会的 链接: https://blog.csdn.net/qq_25004825/article/details/104340272

学习<offer>笔记3

て烟熏妆下的殇ゞ 提交于 2020-02-16 19:44:39
JVM的内存区域 JVM的内存区域分为线程私有区域和线程共有区域,私有区域分为程序计数器,虚拟机栈、本地方法区、线程私有域的生命周期与线程相同,随线程的启动而创建,随线程的结束而结束,JVM中,每个线程都与操作系统的本地线程直接映射。线程共有区域分为堆、方法区。线程共有域随虚拟机的启动而创建,随虚拟机的关闭而销毁。 程序计数器 是一块很小的内存空间,作用是存储当前运行的线程所执行的字节码的行号指示器,每个线程都有一个独立的程序计数器,在方法执行时,该方法的程序计数器吉利的是实时虚拟机字节码指令的地址, 虚拟机栈 记录Java方法的执行过程,在当前栈中存储局部变量,操作数栈,动态链接,方法出口等信息,同时存储部分的运行时的数据机器数据结构,处理动态方法的链接方法的返回值和异常分派。在执行方法时虚拟机会创建一个与之对应的栈帧,方法的执行和方法的返回与虚拟机中的入栈和出栈对应。 本地方法区 本地方法区与虚拟机栈的作用类似,区别是虚拟机栈执行的是java方法,本地方法区执行Native方法 堆 在JVM运行过程中创建的对象和产生的数据都被存储在堆中,线程共享区域,也是垃圾回收器进行回收的最主要的区域, 方法区 作用是存储常量、静态变量、类信息、即时编译器编译后的机器码,运行常量池等数据 常量、静态变量都被存储在运行时常量池中,是方法区的一部分,在类信息文件中不但保存了类的版本,字段,方法

ExecutionContext(执行上下文)综述

三世轮回 提交于 2020-02-16 15:50:47
>>返回《C# 并发编程》 1. 简介 2. 同步异步对比 3. 上下文的捕获和恢复 4. Flowing ExecutionContext vs Using SynchronizationContext 5. 如何适用于 async/await 5.1. 实现方式 5.1.1. ExecutionContext 5.1.2. SynchronizationContext 5.2. 执行过程 5.2.1. SynchronizationContext 使用和控制 5.2.2. ExecutionContext 的流动无法控制 6. 两者的关系 7. 说明 7.1. 示例 7.1.1. 运行过程解析 7.1.2. 带来的思考 1. 简介 注意 : 本篇文章讲述的是在 .Net Framework 环境下的分析, 但是我相信这与 .Net Core 设计思想是一致,但在实现上一定优化了很多。 下面开始本次讲述: ExecutionContext 实际上只是线程相关其他上下文的容器。 有些上下文起 辅助 作用 有些上下文对 .Net 执行模型 至关重要 ExecutionContext 与 周围环境 的信息有关,这意味着,代码正在运行时,它存储了与 当前环境 或 “ context ” 有关的数据。 周围环境 : 代码执行处, 可以访问到 的变量、方法、属性等等。 2. 同步异步对比 在

Java 虚拟机 - 2.2 运行时数据区 Runtime Data Area

牧云@^-^@ 提交于 2020-02-15 23:05:04
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 JVM是一个内存中的虚拟机, Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。 运行时数据区Runtime Data Area 一、程序计数器(Program Counter Register) Java虚拟机栈描述的是Java 方法执行 的内存模型:每个方法执行的同时会创建一个 栈帧 ,栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 Java虚拟机栈是 线程私有 的,它的生命周期与线程相同。 程序员主要关注的所谓的“堆和栈”里的“栈”,就是指 VM stack 虚拟机栈内存 ,更细致的讲,就是虚拟机栈中 局部变量表 部分。 局部变量表存放了编译时期可知的各种 基本数据类型 (boolean, byte, char, short, int, float, long, double), 对象引用 , 和 returnAddress类型 (指向了一条字节码指令的地址)。 局部变量表所需的内存空间在编译时期完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。