曾经古老的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:认识多线程的更多相关文章

  1. Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  2. java之多线程 二

    线程的生命周期: 当线程被创建并被启动时,它既不是一启动就进入了执行状态,在线程的生命周期中,它要经过new(新建),就绪(Runnable),运行(Running),阻塞(Blocked),dead ...

  3. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

  4. Java Thread 多线程 介绍

    1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程 ...

  5. Java:多线程<一>

    程序运行时,其实是CPU在执行程序的进程,为了提高工作效率一个进程可以有多个线程. Java的多线程: 其实我们之前就见过Java的线程,main就是Java的一个线程,还有另一个条线程总是和main ...

  6. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  7. Java的多线程机制系列:(三)synchronized的同步原理

    synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为 ...

  8. Java基础——多线程

    Java中多线程的应用是非常多的,我们在Java中又该如何去创建线程呢? http://www.jianshu.com/p/40d4c7aebd66 一.常用的有三种方法来创建多线程 新建一个类继承自 ...

  9. JAVA之多线程的创建

    转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...

  10. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...

随机推荐

  1. 2015 -&gt; 2016

    2015年. 2015年前几个月,一直住在三亚,每天过着老年人般的生活. 每天吃饭睡觉看电视遛弯游泳.生活倒也满意. 4月份開始,从三亚一路开车回到上海,开开停停,最后享受了一次沿路的风景和满意. 5 ...

  2. 【C#】SQL数据库助手类1.0(自用)

    using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...

  3. ios8 xcode6 下的启动界面设置和图标设置

    IOS8 我试了网上不少设置启动动画的,不知道是不是我弄错了还是怎么的,反正启动不了,后来在code4论坛找到了这个: 启动屏幕:LaunchScreen.xib文件 桌面图标等相关app图片:Ima ...

  4. JDBC五数据源和数据池(web基础学习笔记十一)

    一.为什么使用数据源和连接池 现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接. ...

  5. weblogic.servlet.proxy.HttpProxyServlet 进行代理设置

    1:代理访问服务器应用配置 A:192.168.0.11 B:192.168.0.12 访问:http://192.168.0.11:9001/test/test.jsp 代理服务直接代理访问: ht ...

  6. 算法笔记_175:历届试题 蚂蚁感冒(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它 ...

  7. MVC3中给Html.TextAreaFor设置默认值(初始值)

    <div class="editor-field"> @Html.TextAreaFor(model => model.Comments) @Html.Valid ...

  8. HTTP报文01

    #xiaodeng #HTTP报文01 #HTTP权威指南 45 报文向下游流动- 不管是请求报文还是响应报文,所有报文都会向下游流动. 所有报文的发送者都在接收者的上游. 报文的组成部分 对报文进行 ...

  9. 2014年,daliu_it 年末文章汇总清单

    一.javabase 1. Windows环境下JDK安装与环境变量配置 详细的介绍了JDK的安装以及配图,同时安装的注意事项. 2. 项目的命名规范,为以后的程序开发中养成良好的行为习惯 详细的介绍 ...

  10. ListView中Button事件

    为了解决ListView中Item里的Button独立事件响应,能够採用下面方法: 在BaseAdapter的getview里加入加粗代码: <span style="font-siz ...