第一章线程的认识:
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 死亡状态