java高并发编程详解阅读笔记(一)

    技术2022-07-10  101

    第一章线程的认识:

    1 线程的异步    和  java  jconsole   (控制台jconsole指令 可视化线程监控工具)

    package com.unicom.file.demo; import java.util.concurrent.TimeUnit; /** * <p> * * </p> * * @author chenkang * @since 2020/6/30 */ public class TryConcurrency { public static void main(String[] args) { //并列执行堵塞 只会执行一个 //browseNews(); //linstenMusic(); new Thread(TryConcurrency::browseNews).start(); linstenMusic(); } private static void browseNews(){ for (;;) { System.out.println("good news"); sleep(1); } } private static void linstenMusic(){ for (;;) { System.out.println("nice music"); sleep(1); } } private static void sleep( int seconds){ try { TimeUnit.SECONDS.sleep(seconds); } catch (InterruptedException e) { e.printStackTrace(); } } }

    2 出号机示例代码

    package com.unicom.file.demo; /** * <p> * 出票机线程 * </p> * * @author chenkang * @since 2020/6/30 */ public class TicketWindow extends Thread{ /** * 最大出票书 */ private static final int MAX =50; /** * 初识出票号 */ private static int index =1; public TicketWindow(String name) { super(name); } @Override public void run() { while (index<MAX){ System.out.println("柜台"+this.getName()+"当前出号"+(index++)); } } } package com.unicom.file.demo; /** * <p> * * </p> * * @author chenkang * @since 2020/6/30 */ public class Demo { public static void main(String[] args) { //出票机index 未static修饰的情况下 TicketWindow oneWindow = new TicketWindow("一号出票机"); TicketWindow twoWindow = new TicketWindow("二号出票机"); TicketWindow threeWindow = new TicketWindow("三号出票机"); TicketWindow fourWindow = new TicketWindow("四号出票机"); oneWindow.start(); twoWindow.start(); threeWindow.start(); fourWindow.start(); //执行结果是 各自的出票机分别都是从1 到 50 执行各自的出票 //出票机index static修饰的情况下 //执行结果是 出票机顺序出票了 } }

    static 不可能一直用,同时存在线程安全问题,引出了 Thread 类和 Runable 接口    Thread  注重的是 线程控制 Runable注重的是业务逻辑 来进行解决这一问题,Thread 中  如果 有Runable 实现的传递 则会执行  传递   ,否则需要重写Run  方法 

    改造:

    package com.unicom.file.demo; /** * <p> * * </p> * * @author chenkang * @since 2020/6/30 */ public class Demo { public static void main(String[] args) { TicketWindowRunable task= new TicketWindowRunable(); Thread one = new Thread(task, "一号出票机"); Thread two = new Thread(task, "二号出票机"); Thread three = new Thread(task, "三号出票机"); Thread four = new Thread(task, "四号出票机"); one.start(); two.start(); three.start(); four.start(); } }

     达到了和static 一样的效果

     

    线程的生命周期:

    NEW : 只是创建了线程示例 ,在没有start  之前该线程是根本不存在的,和普通的new  对象没什么区别

    RUNABLE:在调用start之后  进入可运行状态,并没有真正的运行,只具备了运行的资格,什么时候调用看CPU 的调度

    RUNING 状态 一旦CPU 轮训到该任务或者队列选中该线程,那么他才会真正的被执行

    BLOCKED 等待

    TERMINATED  死亡状态

     

    Processed: 0.055, SQL: 9