内核
内核时操作系统的核心
操作系统有内核态和用户态,像我们平时所用到的qq音乐,微信等都属于用户态执行的程序。那么qq音乐播放音乐需要用到扬声器,扬声器的操作就是在内核空间进行操作,用户态不能对其进行操作。
操作系统 = 内核+配套的应用程序
当我们运行代码的时候发现Thread和main同时打印,这就是两个线程并发执行,在上面的工具中我们也看到了main,Thread-0这俩个线程,其他一些线程都是自带的,用来完成内存回收啊,一些操作我们不用过多理解。
这里调度时随机的,没有先后顺序,这是由于我们时抢占式执行,即开始执行时间和结束执行时间都随机。但一般在这个代码中,main应该更快一步。因为当我们创建t线程的时侯,主线程继续向下执行,我们说这两个线程在一个进程中,但是创建线程虽然不要开辟空间,但是也不是完全没有消耗,他要建立自己的pcd。所以第一次执行被main抢占先机。
当我们点开的时候会发现一个堆栈跟踪,这就是代码执行到哪里,这是对其的一个快照,即这次点击和下次点击结果可能有所不同。
线程创建的几种方式
继承Thread 重写run方法
实现Runnable接口,重写run方法
继承Thread,重写run,但使用匿名内部类
实现Runnable接口,重写run方法,使用匿名内部类
但是上面四种都不太常用,一般使用lambda表达式
Thread其他方法
Thread()
Thread(Rannable b)
Thread(String name)
Thread(Rannable b String name)
这里的name就是线程名,默认就是上面的Thread-0
Thread常见属性
getId()
身份标识
getName()
就是上面说的name
getState()
状态,就绪/阻塞
getPriority()
优先级
getDaemon()
是否为后台线程,这里默认为前台线程。这里的前台后台和手机app前后台不同,前台线程会阻止进程结束,后台线程不会阻止进程结束。也就是说只要前台线程全部执行完毕,整个进程都会结束
默认是前台线程,传入true为后台线程。
isAlive()
是否存活,表示pcd是否存在。
这里对象实例的生命周期,和内核pcd周期是不同的,当Thread t = new Thread();这时t就已经存在,但是内核中pcd还没有存在t.start才真正创建了
第一个打印为false,但t已经实例过了,第二次为true因为线程没有结束,第三次为false但t仍然没有被释放,不过其线程已经结束。