#深入浅出Java多线程
慕课网对应课程 – 深入浅出Java多线程

Java多线程基础概念

进程

程序(任务)的执行过程 动态性
持有资源(共享内存,共享文件)和线程

线程

线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源

线程的交互
互斥 同步

Java线程的常用方法


演员程序

package com.mooc.actor;
public class Actor extends Thread{@Overridepublic void run() {System.out.println(getName()+"is an Actor");int count = 0;boolean keepRunning = true;while (keepRunning){System.out.println(getName()+" is on stage "+ (++count));if (count==100){keepRunning = false;}if (count%10 ==0){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println(getName()+" end Shows!");}public static void main(String[] args){Actor actor = new Actor();actor.setName("Mr.Thread");actor.start();Thread actress = new Thread(new Actress(),"Ms.Runnable");actress.start();}
}class Actress implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"is an Actor");int count = 0;boolean keepRunning = true;while (keepRunning){System.out.println(Thread.currentThread().getName()+" is on stage "+ (++count));if (count==100){keepRunning = false;}if (count%10 ==0){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println(Thread.currentThread().getName()+" end Shows!");}
}

军队:ArmyRunnable
英雄人物:KeyPersonThread
舞台: Stage

ArmyRunnable

package com.mooc.concorrent;public class ArmyRunnable implements Runnable{// volatile 保证了线程可以正确的读取其他线程写入的值// 可见性 ref JMM, happens-before原则volatile boolean keepRunning = true;@Overridepublic void run() {while(keepRunning){// 发动5连击for (int i=0;i<5;i++){System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]");//让出处理器的时间,下次该谁进攻还不一定Thread.yield();}}System.out.println(Thread.currentThread().getName()+"结束了战斗");}
}

KeyPersonThread

package com.mooc.concorrent;public class KeyPersonThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"开始了战斗!!");for (int i=0;i<10;i++){System.out.println(Thread.currentThread().getName()+"左突右杀,攻击隋军...");}System.out.println(getName()+"结束了战斗!");}
}

Stage

package com.mooc.concorrent;/*** 隋唐演义的大戏舞台*/
public class Stage extends Thread {@Overridepublic void run() {System.out.println("欢迎观看隋唐演义");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("大幕徐徐拉开!");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("话说隋朝末年,隋军与农名起义军杀得昏天地暗...");ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();ArmyRunnable armyTaskOfRevolt = new ArmyRunnable();//使用Runnable结口创建新程Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty,"隋军");Thread armyOfRevolt = new Thread(armyTaskOfRevolt,"农民起义军");// 启动线程,军队开始作战armyOfSuiDynasty.start();armyOfRevolt.start();// 舞台休眠,专心看军队厮杀try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("正当双方激战正酣,半路杀出了程咬金");KeyPersonThread mrCheng = new KeyPersonThread();mrCheng.setName("程咬金");System.out.println("程咬金的理想就是结束战争,使百姓安居乐业!");armyTaskOfSuiDynasty.keepRunning = false;armyTaskOfRevolt.keepRunning = false;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}/*** 历史大戏留给关键人物*/mrCheng.start();// 万众瞩目,所有线程等待程先生完成历史使命try        {mrCheng.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("战争结束。人民安居乐业,程先生实现了积极地人生梦想,为人民做出了贡献!!");System.out.println("谢谢观看隋唐演义,再见!!");
//        try {//            armyOfRevolt.join();
//        } catch (InterruptedException e) {//            e.printStackTrace();
//        }}public static void main(String[] args ){new Stage().start();
//        Thread stage = new Stage();
//        stage.start();}
}

jion 方法的作用;

Java线程的正确停止

Java线程停止的错误方法stop()

not stop()方法
stop()方法会让线程戛然而止,我们不知道那些工作还没有做,也不知道现在已经完成了什么,无法开展清理工作

Java线程停止的正确方法-设置退出flag
public void run() {while(keepRunning){// 发动5连击for (int i=0;i<5;i++){System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]");//让出处理器的时间,下次该谁进攻还不一定Thread.yield();}}System.out.println(Thread.currentThread().getName()+"结束了战斗");}
Java 线程停止广为流传的错误方法–interrupt()

interruput()方法的初衷并不是用于停止线程

try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}

package com.mooc.concorrent;public class WrongWayStopThread extends Thread{@Overridepublic void run() {//        while (true){while (!this.isInterrupted()){System.out.println("Thread is running...");long time = System.currentTimeMillis();while ((System.currentTimeMillis()-time)<1000){//减少屏幕输出的空循环}/*** 不能使用sleep,会清空interrupt 状态,抛出interruptException*/
//            try {//                Thread.sleep(1000);
//            } catch (InterruptedException e) {//                e.printStackTrace();
//            }}}public static void main(String[] args){WrongWayStopThread thread = new WrongWayStopThread();System.out.println("Starting thread...");thread.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Interrupting  thread...");thread.interrupt();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Stoping application...");}
}

线程交互

争用条件

Race Condition
当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件。

线程的交互: 互斥与同步
  • 互斥
  • 同步 通信机制

Java多线程--深入浅出Java多线程相关推荐

  1. Java 多线程深入浅出

    首先关于Volatile修饰符: Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存.这样在任何时刻,两 ...

  2. 【JAVA基础篇】多线程

    学习Java的多线程知识之前,我们先来了解一下进程和线程的概念,以及他们之间的关系. 进程 基本概念 进程是具有独立功能的程序在某个数据集合上的一次执行过程. 特点 进程是操作系统进行资源分配和调度的 ...

  3. java高并发与多线程汇总(一):基础知识(上)

    java高并发与多线程汇总 往期文章推荐:   java高并发与多线程汇总(一):基础知识(上)   java常见面试考点(四十二):序列化与反序列化   java常见面试考点(四十三):泛型   j ...

  4. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  5. Java高级特性增强-多线程

    请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwub... ...

  6. Java基础篇:多线程

    文章目录 1.概念:程序.进程.线程 2.线程的创建和使用 3.线程的生命周期 4.线程的同步 5.线程的通信 6.JDK5.0新增线程创建方法 1.概念:程序.进程.线程 程序(program)是为 ...

  7. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  8. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)

    多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...

  9. 2019-06-03 Java学习日记 day24 多线程

    多线程 线程是程序执行的一台路径,一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率,可以同时完成多项工作 多线程的应用背景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时 ...

最新文章

  1. POJ 3274 Gold Balanced Lineup(哈希)
  2. 修改fragment的进入动画_3DsMax—牛顿摆球(动量守恒摆球)动画
  3. 同样是面对失败的责任:任春雷比杜一楠更有种
  4. go mysql use 问题,Go语言使用MySql的方法
  5. 二级VB培训笔记09:真考题库试卷75演练
  6. HttpReponse
  7. Android--android 中自定义菜单
  8. WinForm中TextBox的几个基本技巧
  9. 我的本科毕业论文——Messar即时通讯系统
  10. 移动设备尺寸规范汇总(转)
  11. PyTorch学习(九)--用CNN模型识别手写数字数据集MNIST
  12. 家里wifi网速越来越慢_家里WIFI出现卡顿,网速变慢怎么办?
  13. CSS RGB颜色设置
  14. Win10取消文件默认打开方式
  15. xutils获取数据
  16. window.opener用法(在子窗体中获得父窗体的方法)
  17. 《用图表说话》读后感
  18. word段落间距调整:格式刷/取消对齐网格/分节符/擦除格式都无效的应对方法
  19. windows下WNMP(windows+nginx+mysql+php)配置
  20. 基于Blackfin处理器的嵌入式数码相框

热门文章

  1. Mysql---将多条查询记录合并为一条,用逗号连接展示
  2. 微信使用篇 - 如何在订阅号与服务号之间做出选择
  3. 【模块电路】继电器驱动应用
  4. html格式转换word清除格式,如何清除掉Word文档表格里的格式?
  5. k8s学习笔记——ceph rbd本地手动挂载
  6. indexedDB使用
  7. 位运算符以及他们的用途
  8. 微信浏览器禁止下载APK文件 微信扫描二维码 下载app的方法
  9. react学习笔记一:入门级小白到脚手架(create-react-app)开发项目
  10. mysql 增加字段