第一章线程的认识:
1 线程的异步 和 java jconsole (控制台jconsole指令 可视化线程监控工具)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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 出号机示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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++)); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 方法
改造:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 一样的效果