Java多线程--深入浅出Java多线程
#深入浅出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多线程相关推荐
- Java 多线程深入浅出
首先关于Volatile修饰符: Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存.这样在任何时刻,两 ...
- 【JAVA基础篇】多线程
学习Java的多线程知识之前,我们先来了解一下进程和线程的概念,以及他们之间的关系. 进程 基本概念 进程是具有独立功能的程序在某个数据集合上的一次执行过程. 特点 进程是操作系统进行资源分配和调度的 ...
- java高并发与多线程汇总(一):基础知识(上)
java高并发与多线程汇总 往期文章推荐: java高并发与多线程汇总(一):基础知识(上) java常见面试考点(四十二):序列化与反序列化 java常见面试考点(四十三):泛型 j ...
- java线程钥匙_Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- Java高级特性增强-多线程
请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwub... ...
- Java基础篇:多线程
文章目录 1.概念:程序.进程.线程 2.线程的创建和使用 3.线程的生命周期 4.线程的同步 5.线程的通信 6.JDK5.0新增线程创建方法 1.概念:程序.进程.线程 程序(program)是为 ...
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)
多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...
- 2019-06-03 Java学习日记 day24 多线程
多线程 线程是程序执行的一台路径,一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率,可以同时完成多项工作 多线程的应用背景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时 ...
最新文章
- POJ 3274 Gold Balanced Lineup(哈希)
- 修改fragment的进入动画_3DsMax—牛顿摆球(动量守恒摆球)动画
- 同样是面对失败的责任:任春雷比杜一楠更有种
- go mysql use 问题,Go语言使用MySql的方法
- 二级VB培训笔记09:真考题库试卷75演练
- HttpReponse
- Android--android 中自定义菜单
- WinForm中TextBox的几个基本技巧
- 我的本科毕业论文——Messar即时通讯系统
- 移动设备尺寸规范汇总(转)
- PyTorch学习(九)--用CNN模型识别手写数字数据集MNIST
- 家里wifi网速越来越慢_家里WIFI出现卡顿,网速变慢怎么办?
- CSS RGB颜色设置
- Win10取消文件默认打开方式
- xutils获取数据
- window.opener用法(在子窗体中获得父窗体的方法)
- 《用图表说话》读后感
- word段落间距调整:格式刷/取消对齐网格/分节符/擦除格式都无效的应对方法
- windows下WNMP(windows+nginx+mysql+php)配置
- 基于Blackfin处理器的嵌入式数码相框