Java基础知识9-多线程1

配图

什么是多线程

     java对多线程编程提供了内置支持。多线程程序包含同时运行的两个或多个部分。这种程序的每个部分被称为一个线程,每个线程定义了单独的执行路径。因此,多线程是特殊形式的多任务处理。
     多任务处理有两种不同的类型:基于进程的多任务处理和基于线程多多任务处理。

进程和线程区别

     基于进程的多任务处理就是允许计算机同时运行两个或更多个程序特性。例如,基于进程的多任务处理可以运行java编译器的同时使用文本编辑器或浏览网站。在基于进程的多任务处理中,程序是调度程序能够调度的最小单元。
     基于线程的多任务环境中,最小的可调度代码单元是线程,这意味着单个程序可以同时执行两个或多个任务。例如,在文本编辑器可以在打印的同时格式化文本,只要两个动作是通过两个独立的线程执行即可。

因此,基于进程的多任务处理“大局”,而基于线程的多任务处理“细节”。

java线程模型

     java运行时系统在许多方面依赖于线程,并且所有类库在设计时都考虑了多线程。事实上,java通过利用线程使得整个环境能够异步执行。有助于通过防止浪费CPU时钟周期来提高效率。
     通常,在单线程环境中,当线程因为等待某些资源而阻塞(即挂起执行)时,整个程序会停止运行。
     java多线程的优点消除了主循环/论询机制。可以暂停一个线程而不会停止程序的其他部分。也就是说,当java程序中的线程堵塞时,只有被阻塞的线程会停止,所有其他线程仍将继续执行。

线程的多种形态

     运行(running)状态:只要获得CPU时间就准备运行。运行的线程可以被挂起(suspended),这会临时停止线程的活动。挂起的线程可以被恢复(resumed),从而允许线程从停止处恢复执行。当等待资源时,线程会被阻塞(blocked)。

在任何时候,都可以终止线程,这会立即停止线程的执行。线程一旦终止,就不可能再恢复。

线程优先级

     java为每个线程都指定了优先级,优先级决定了相对于其他线程应当如何处理某个线程。线程优先级的一些整数,它们指定了一个线程相对于另一个线程的优先程度。优先级的绝对数值没有意义;如果只有一个线程在运行,优先级高的线程不会比优先级低的线程运行的快。反而,线程的优先级用于决定何时从一个运行的线程切换到下一个,这称为上下文切换。
     决定上下文切换发生时机的规则比较简单:
     1.线程自愿地放弃控制。线程显示地放弃控制权、休眠或在I/O之前堵塞,都会出现这种情况。在这种情况下,检查所有其他线程,并且准备运行的线程中,优先级最高的那个线程会获得CPU资源。
     2.线程被优先级更高的线程取代。对于这种情况,没有放弃控制权的低优先级线程不管在做什么,都会被高优先级线程简单地取代。基本上,只要高优先级线程希望运行,它就会取代低优先级线程,这称为抢占式多任务处理。
     如果具有相同优先级的两个线程竞争CPU资源,这种情况有些复杂。对于windows操作系统,优先级相等的线程以循环方式自动获得CPU资源。对于其他操作系统,优先级相等的线程必须资源的向其他线程放弃控制权,否则其他线程就不能运行。

注意:操作系统以不同的方式对具有相等优先级的线程进行上下文切换,可以会引起可移植性问题。

同步

     因为多线程为程序引入了异步行为,所以必须提供一种在需要时强制同步的方法。例如,如果希望两个线程进行通信并共享某个复杂的数据结构。如链表,就需要以某种方式确保它们相互之间不会发生冲突。也就是说,当一个线程正在读取该数据结构时,必须阻止另外一个线程向该数据结构写入数据。

消息传递

     将程序分隔到独立的线程之后,需要定义它们之间相互通信的方式。当使用某些其他语言编写程序时,必须依赖操作系统建立 线程间相互通信的方式。java为两个或多个线程之间的相互通信提供了一种简洁的低成本方式。java的消息传递系统允许某个线程进入对象的同步方法,然后进行等待,直到其他线程显示的通知这个线程退出为止。

Thread类和Runnable接口

     java的多线程系统是基于Thread类、Thread类的方法以及伴随接口Runnable而构建的。Thread类封装了线程的执行。因为不能直接引用正在运行的线程的细微状态,所以需要通过代理进行处理,Thread实例就是线程的代理。为了创建新的线程,程序可以扩展Thread类或实现Runnable接口。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 线程概述 线程与进程 进程  每个运行中的任务(通常是程序)就是一个进程。当一个程序进入内存运行时,即变成了一个进...
    闽越布衣阅读 1,010评论 1 7
  • 一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6....
    GT921阅读 1,013评论 0 3
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,454评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,957评论 1 18
  • [PHP ---动态图](http://www.zhangxinxu.com/wordpress/2015/12/...
    狼之独步阅读 1,287评论 0 0