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