zoukankan      html  css  js  c++  java
  • Java多线程开发系列之一:走进多线程

    对编程语言的基础知识:分支、选择、循环、面向对象等基本概念理解后,我们需要对java高级编程有一定的学习,这里不可避免的要接触到多线程开发。

    由于多线程开发整体的系统比较大,我会写一个系列的文章总结介绍 多线程开发的概念、使用、线程状态、同步、线程池。希望与大家共勉。

     

    在第一部分,也就是本节我们先介绍下 什么是多线程程序、线程和进程又是什么,以及为什么要搞多线程。


    (一)什么是多线程程序

    多线程听上去是非常专业的概念,其实非常简单,我们在日常生活中,经常的接触到多线程。

    比如

    (1)在工厂,工人努力工作,分工明确。一些工人准备生产资料(混凝土、钢筋、砖头),另外一些工人挖掘地基,还有些工人负责平常无聊的看管,后勤的保障(有点像守护进程,这个后面会专门讲到)。他们总体来说就是把一件事分成若干的工作,然后派不同的人去做,最后使工作得到完善的解决。(一个工人算一条线程)

    (2)一个学生完成晚上写的作业,有语、数、外的作业。这名学生写了一半的语文作业后,有一道题不会做,先去完成数学作业,接着再完成英语作业,最后等到家长回来完成语文作业。(一门作业算一条线程)

    主要是有这两种情况的多线程,

    一种是上边有多个工人(多处理器),各个工人间的工作影响不大,不会因为其中一个工人的努力工作,而导致另外一个工作停歇。

    另外一种就是下边的写作业形式(单处理器,只有一个人在做作业),虽然我们有多个作业需要在今天晚上完成(执行),但是某一个时刻我们只能做一件事,当遇到某种情况(例如不会做、或者心情不好)我们随意的切换到其他的科目,然后开始其他的工作,因为某些原因(如有人可以出现辅导),那么我们又可以切换回来,继续做一开始未完成的事情,直到所有的事情都解决完为止。这里要区分一下:写作业的例子看着有点像单线程模式的例子,实则不然,单线程只能按照某种既定的顺序,顺序完成事情,比如语文->外语->数学。遇到困难时(不会做),并不能因为某种原因,而随意的切换,只能苦苦等待。而多线程则可根据环境动态的转换,如他们之间的顺序如语文->外语->数学->语文->外语->外语->数学 这样。(防盗连接:本文首发自王若伊_恩赐解脱http://www.cnblogs.com/jilodream/ )

    这种一次做多件事的情况就是多线程(包含短时间内快速的切换,形成一次做多件事的感觉),下面介绍进程和线程,从计算机的角度来谈谈编程中多线程的概念。


    (二)线程和进程又是什么

    进程: 对于一个OS,如果有一个程序在内存中开始运行,我们就可以说这个运行的程序就是一个进程。这个进程拥有自己独立的功能,并且是OS调度和分配资源的一个独立单位。

     对于进程有三个特点

    (1)独立性:进程是系统中独立存在的一个实体,拥有自己的资源的,没有自身的允许的话,其他用户进程是不能访问他内部的。

    (2)动态性:进程是有生命周期的,他是在OS中活动的一个指令集合。而程序只是一个静态的指令集合。

    (3)并发性:在只有一个处理器时,多个进程间也可以并发执行,互相并不影响。(进程间相互轮换执行,如同同时进行一般)

    线程:线程是进程执行单元,也可以说是一个轻量级的进程。就像OS中进程是独立的一样,进程中的各个线程也是独立的。每个线程都有自己独立的堆栈及其他资源。互相并不受影响。而进程(这些线程的拥有者)的所有系统资源,被它包含的所有线程所共有分享。

          线程也是独立的,他并不知道当前进程中其他线程的存在,而当前线程是否被执行,则与进程类似,是抢占式的。当前进程抢到了OS的执行权,而进程中的某一条线程又抢到了,当前可执行的权利(其他线程和进程被挂起)。

    多线程就是一个进程中,可以有多个并发执行的独立的任务,每一个任务可以说就是一个线程。

    他们的关系:

    一个OS下边可以有若干的进程(但是至少要有一个进程)。

    每一个进程下边又有若干的线程(至少要有一条线程)。


    (三)为什么要搞多线程呢?

    最最最核心的原因就是:提高工作效率,不要出现闲时等待,各个线程抢占式的工作。试想下,如果我们遇到什么问题,是应该一直苦苦等待(是什么都不做的等待)下去性能高呢,还是快速的切换到其他工作上去,我想在大部分的情况下都是快速抢占吧。(有时可能会出现,你刚刚切换,原来苦苦等待的事情刚刚结束。。。。这种碰巧的情况),举个实际点的例子,当我们查询某一个数据时,这个数据可能非常大,我们需要等待好久才能在页面上加载下来,此时倘若单线程苦苦等待时,我们的程序就是被挂死了(试想下没有响应的场景),直到过去了很久,页面才被激活,变成可用的状态。这期间我们什么事情也干不了(对该程序),这时的场景效率很低下,而且非常不友好。

      倘若有很好的多线程支持的话,那么在加载数据、绘制图片时,我们还可以随意的切换程序,并不影响其他的操作,从而提高性能。于此同时,由于多线程共享父进程的其他所有资源,所以线程间可以很好的交流数据(数据共享和通信),并且新开辟的线程(新开辟的任务),OS并不会为该进程分配大量的资源(相对于为新开辟任务而创建新进程而言)。

    总结一下有如下几个优点

    1、线程间可以很好的共享内存资源,进程间是完全独立内存的,所以不方便。(前文中提到线程间是相互独立的,除非一进程允许,否则其他的进程是不允许直接访问它地址的)

    2、系统创建新线程的开销,新创建进程的开销要小的多,因此可大大降低多并发的代价。

    3、在编码时,我们可以通过类库和代码很好的管理各个线程,而不是直接通过操作系统来指挥当前执行的进程。从而大大的方便了我们可以处理并发任务的执行。

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/jilodream/p/4278211.html
Copyright © 2011-2022 走看看