JAVA:认识多线程
曾经古老的DOS操作系统是单任务的。还没有线程的概念,系统在每次仅仅能做一件事情。比方你在copy东西的时候不能rename文件名称。
为了提高系统的利用效率,採用批处理来批量运行任务。
如今的操作系统都是多任务操作系统,每一个执行的任务就是操作系统所做的一件事情。比方你在听歌的同一时候还在用MSN和好友聊天。
听歌和聊天就是两个任务。这个两个任务是“同一时候”进行的。一个任务一般相应一个进程。也可能包括好几个进程。
比方执行的MSN就相应一个MSN的进程。假设你用的是windows系统,你就能够在任务管理器中看到操作系统正在执行的进程信息。
一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。
比方QQ。你用QQ等多个账号的时候。打开任务管理器的时候就会发现打开一个账户就会有一个进程。启动进程的时候。操作系统会为进程分配资源。当中最基本的资源是内存空间。由于程序是在内存中运行的。
在进程中。有些程序流程块是能够乱序运行的。而且这个代码块能够同一时候被多次运行。实际上,这种代码块就是线程体。线程是进程中乱序运行的代码流程。当多个线程同一时候运行的时候,这种运行模式成为并发运行。当中一半会满足两个条件,一个是能够乱序运行。一个是会被多次运行。
多线程的目的是为了最大限度的利用CPU资源。
Java编敲代码都执行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。
在同一个JVM进程中。有且仅仅有一个进程。就是它自己。在这个JVM环境中,全部程序代码的执行都是以线程来执行。
一般常见的Java应用程序都是单线程的。比方,用java命令执行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程。JVM找到程序程序的入口点main(),然后执行main()方法。这样就产生了一个线程,这个线程称之为主线程。
当然除了主线程之外肯定还会有另外的后台线程。比方肯定会有的垃圾回收线程。
当main方法结束后。主线程执行完毕,当前台线程,这里也就是主线程,其它后台线程也随之结束。JVM进程也随即退出 。
对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信非常easy,速度也非常快。不同的进程由于处于不同的内存块,因此进程之间的通信相对困难,为了保证其安全性和每一个账户各自不同属性。多个QQ账号是以多个进程而非多个线程来执行。但线程共享进程块的内存也带来另外一个问题。当对个进程訪问同一个类调用同样的方法和读写同样变量时可能会破坏数据。导致异常的情况。
在Java程序中,JVM负责线程的调度。线程调度是值依照特定的机制为多个线程分配CPU的使用权。
调度的模式有两种:分时调度和抢占式调度。
分时调度是全部线程轮流获得CPU使用权,并平均分配每一个线程占用CPU的时间。抢占式调度是依据线程的优先级别来获取CPU的使用权。
JVM的线程调度模式採用了抢占式模式。比方Main线程它的优先级就是5。你能够通过setPriority()函数来设置线程的优先级,从1到10,10优先级最高,1优先级最低,但不代表优先级高就一定先运行,谁先运行还是取决于谁先抢占CPU的资源,较高的优先级唯独有比較高的运行机会。JVM提供了10个线程优先级,但与常见的操作系统都不能非常好的映射。假设希望程序能移植到各个操作系统中,应该只使用Thread类有下面三个静态常量作为优先级,这样能保证相同的优先级採用了相同的调度方式。
所谓的“并发运行”、“同一时候”事实上都不是真正意义上的“同一时候”。
用我们操作系统老师的话说就是,宏观上并行。微观上串行。尽管操作系统是多线程多任务的,可是对于CPU来说。在同一时刻内,它仅仅能做一件事。
在一个时钟周期内。它就仅仅能运行一条命令(特殊情况会有多条)。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每一个进程非常短的一段是时间(不一定是均分),然后在每一个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去运行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步运行的。
部分概念:
主线程:JVM调用程序mian()所产生的线程。
当前线程:这个是easy混淆的概念。一般指通过Thread.currentThread()来获取的进程。
后台线程:指为其它线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。
前台线程:是指接受后台线程服务的线程,事实上前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。
傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。能够通过isDaemon()和setDaemon()方法来推断和设置一个线程是否为后台线程。
JAVA:认识多线程的更多相关文章
- Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- java之多线程 二
线程的生命周期: 当线程被创建并被启动时,它既不是一启动就进入了执行状态,在线程的生命周期中,它要经过new(新建),就绪(Runnable),运行(Running),阻塞(Blocked),dead ...
- Java的多线程机制系列:(一)总述及基础概念
前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...
- Java Thread 多线程 介绍
1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程 ...
- Java:多线程<一>
程序运行时,其实是CPU在执行程序的进程,为了提高工作效率一个进程可以有多个线程. Java的多线程: 其实我们之前就见过Java的线程,main就是Java的一个线程,还有另一个条线程总是和main ...
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- Java的多线程机制系列:(三)synchronized的同步原理
synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为 ...
- Java基础——多线程
Java中多线程的应用是非常多的,我们在Java中又该如何去创建线程呢? http://www.jianshu.com/p/40d4c7aebd66 一.常用的有三种方法来创建多线程 新建一个类继承自 ...
- JAVA之多线程的创建
转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...
- Java基础--多线程的方方面面
1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...
随机推荐
- [Algorithm] Serialize and Deserialize Binary Tree
Given the root to a binary tree, implement serialize(root), which serializes the tree into a string, ...
- [CSS] Collapsing Margins
Refactor the spacing between <header>, <article>, and <aside> so that elements wil ...
- nyoj-659-推断三角形(大坑)
推断三角形 时间限制:1000 ms | 内存限制:65535 KB 难度: 描写叙述 小明非常喜欢研究三角形.如今,小明已经知道三角形的三条边.假设三条边能组成三角形,小明就会非常高兴,他就会得 ...
- (LeetCode74)Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- oracle client字符集设置 乱码问题
程序员经常要连接数据库 下面 就说一下 oracle数据库 客户端与服务器端 字符集一致性的问题 这可以解决中文乱码,其他字符乱码问题 主要是指在sqlplus中,其他类似toad/pls ...
- Python标记去重
预逻辑脚本代码: uniqueList = [] def isDuplicate(inValue): if inValue in uniqueList: return 1 else: uniqueLi ...
- 搭建一个SpringBoot项目
1.创建项目 New->Spring Starter Project 2.添加支持 增加对mybatis plus的支持,修改pom.xml,增加如下内容: <dependency> ...
- (C++)UrlEncode的标准实现
http://blog.163.com/xiaopengyan_109/blog/static/149832173201072685539394/ 地址栏传中文参数后是什么编码格式 网页中的表单使用P ...
- uni-app - vue以及微信小程序
uni-app结合了mpvue的优点以及微信小程序的优点 ,uni-app基于vue2.0的. 组件:https://uniapp.dcloud.io/component/README 接口:http ...
- wepy - 使用vsCode编辑器安装插件
完成后,高亮以及智能补全代码. 1. 首先ctrl+shift+p打开扩展,安装以下三个插件 2. 复制以下文件内容到你的vsCode配置 files.associations { "fil ...