Java 基础(二)多线程

 多线程优点:最大限度的利用CPU的空闲时间来处理其他任务。

1.1 线程与进程的关系

    * 进程是操作系统资源分配的最小单位,是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,相互不影响。

    * 线程是程序执行(CPU调度f)的最小单位,是进程中的一个执行流程,一个进程中可以运行多个线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。

    * 运行一个程序会产生一个进程,进程包含至少一个线程。

1.2 创建线程

    线程的调度是由CPU决定,CPU执行子任务时间具有不确定性。线程数据共享,只的是同一个类中的不同实例,共享数据。

1.2.1 继承 Thread 类 创建线程

    继承Thread 类,然后重写父类的 run() 方法。

1.2.2 實現 Runnabel 接口

   實現Runnable的接口,重寫run() 方法

1.2.3 匿名內部类

    匿名内部类的方式适用于创建启动线程次数较少的环境,书写更加简便。即在类中直接new Thread

1.2.4 继承 callable 接口

    继承callable接口后,重写call方法,返回接口类型

1.2.5 Spring实现多线程 

1.3  生命周期和状态

1.3.1  Java 线程有5种基本状态,分别是:

    新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

    就绪状态(Runnable):线程创建后,其他线程调用了该线程对象的 start() 方法。该方法状态的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权;

    运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就    绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

    阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。知道线程进入就绪状态,才有机会转到运行状态。阻塞的情况分为三种:

        1)等待阻塞:运行的线程执行 wait() 方法,JVM 会把该线程放入线程池中。

        2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池中。

        3)其他阻塞:运行的线程执行 sleep() 或 join() 方法,或者发出了 I/O 请求时,JVM 会把该线程设置为阻塞状态。当 sleep() 超时、join() 等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。

    死亡状态(Dead):线程执行完了或者因异常退出了 run() 方法,该线程结束生命周期。

1.3.2 线程阻塞

    上文说了线程的阻塞有三种情况,等待阻塞,同步阻塞,其它阻塞。

    1)阻塞线程的方法: sleep()、join() 、 yield()、wait()

    slepp()  方法是线程休眠指定的时间,让其它的线程先走,但是它不会释放对象锁(如果有对象锁的话),其它线程不能修改所对象的数据

    yied()    让当前线程放弃系统分配的时间片,把状态变为就绪状态,它不会释放所对象。

    join()  是Thread类的非静态方法底层调用的是wait(),是当前线程A调用另一个线程B的join()方法,当前线程转A入阻塞状态,直到线程B运行结束,线程A才由阻塞状态转为可执行状态。

            他有几个构造函数,例如:join(long millis) ,当millis==0时,会进入while(isAlive())循环;即只要子线程是活的,主线程就不停的等待。

              有个问题,join 会不会释放锁。

    wait()    需要在synchronized 代码块执行,会释放对象锁(资源),线程状态变为就绪状态,等待被唤醒。

1.3.3 线程的各方法介绍

1.3.3.1  wait, notify, notifyAll, join, yied

    wait()、notify/notifyAll() 在synchronized 代码块执行, 她们属于Object类,而不属于Thread类。

    wait( )会先释放锁住的对象,然后再执行等待的动作

1.3.3.2 sleep() 方法和 wait() 方法区别和共同点

    sleep()释放CPU执行权,但不释放同步锁;

    wait()释放CPU执行权,也释放同步锁,使得其他线程可以使用同步控制块或者方法。

 1.3.4  线程安全与竟态

1.3.4.1线程死锁和避免死锁

死锁产生的四个条件:

互斥条件: 该资源任意一个时刻只由一个线程占用;

请求与保持条件:一个线程因请求资源而阻塞,对已获得的资源保持不放;

不剥夺条件:线程已经获得的资源在未使用完之前不能被其他线程强行剥夺,只由自己使用完毕后才释放资源;

循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

怎么避免线程死锁?

只需要破坏产生死锁的四个条件之一即可。

破坏互斥条件:这个条件我们没有办法破坏,因为我们用锁本身就是想让他们互斥的(临界资源需要互斥访问)。

破坏请求与保持条件:一次性申请所有的资源

破坏不剥夺条件:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

破坏循环等待条件:靠按顺序申请资源来预防。按照某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

1.4 锁

 1.4.1 悲观锁和乐观锁

1.4.2 Synchronized的使用

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

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,438评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,948评论 1 18
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 643评论 0 4
  • 一、进程和线程 进程 进程就是一个执行中的程序实例,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。...
    阿敏其人阅读 2,606评论 0 13
  • 本文主要介绍线程的定义,创建,使用,停止,状态图和常用方法。主要用于概念扫盲和梳理。多进程是指操作系统能同时运行多...
    stoneyang94阅读 1,180评论 2 5