线程的先后不分
线程是个动态的过程 t1 t2 t3 这三个线程是由主线程执行创造出来的 所以叫子线程
新建 就绪 运行 堵塞
线程有独立的栈
线程中常见的属性:
1 id JVM进程内部分配给唯一的id只能get 不能set thread,getID 就像身份证号 出生就被分配 无法修改
2 name 线程的名字 可以设置
public class Test {
static class MyThread extends Thread{
public MyThread(){
setName("玛卡巴卡");//super(“我是玛卡巴卡”) 构造方法
}
@Override
public void run() {
System.out.println(this.getName());
}
public static void main(String[] args) {
Thread thread=Thread.currentThread();
System.out.println(thread.getName());
MyThread t1=new MyThread();
t1.start();
MyThread t2=new MyThread();
t2.start();
}
}
}
线程的状态:新建——就绪——运行——结束 阻塞
理论上和java代码实际上看到的状态
new 新建
runnable 就需+运行
terminated: 结束
blocked+waiting+timed_waiting:阻塞
java中的枚举enumeration
线程状态只能获取 不能设置 但是我们可以通过代码影响他
线程可以get/set自己的优先级
注意:只是建议 不能强制
前台线程 VS 后台线程 daemon(精灵)后台
前台线程:做交互 例如:1线程响应用户点击(前台) 2 线程去后台下载歌曲(后台)
我们创造出来的线程默认是前台线程 除非修改
sout(t.isDaemon() ) true 为后台
所有前台线程都退出的时候 JVM进程也就退出了 和后台线程 和主线程没关系
总结 线程的场景属性通过Thread对象进行操作
id name 状态 优先级 前/后台线程
Git。。。。
javac.exe java.exe
jconsole.exe JVM 运行的情况 内存 类加载 线程情况
TimeUnit.SECONDS.sleep(1) 睡眠一秒
A线程:
1创建b线程,并启动b线程
2等待b线程完成所有工作(B线程运行结束)
3打印b线程已经退出了
join b.join
从线程的状态的角度 调用sleep就是让当前线程运行——阻塞
Thread.currentThread()
线程内容总结:如何在代码中创建线程 线程在底层的原理(OS+执行流)
县城结果的随机性 常见属性 相关工具:debug jconsole
Thread 常见方法sleeo currentThread()
在没有多线程(执行流)+没有外部输入的情况下 程序的运行其实就是一个状态机
栈维护了一个方法流
栈:当前执行流的当前时刻(时间停止状态时)的状态框有哪些 现实方法的调用次序
框:栈帧(frame)装的就是运行该方法时需要的一些临时数据(主要就是一些临时变量)