JAVAEE---多线程

内核

内核时操作系统的核心

操作系统有内核态和用户态,像我们平时所用到的qq音乐,微信等都属于用户态执行的程序。那么qq音乐播放音乐需要用到扬声器,扬声器的操作就是在内核空间进行操作,用户态不能对其进行操作。

操作系统 = 内核+配套的应用程序

JAVAEE---多线程_第1张图片JAVAEE---多线程_第2张图片

当我们运行代码的时候发现Thread和main同时打印,这就是两个线程并发执行,在上面的工具中我们也看到了main,Thread-0这俩个线程,其他一些线程都是自带的,用来完成内存回收啊,一些操作我们不用过多理解。

这里调度时随机的,没有先后顺序,这是由于我们时抢占式执行,即开始执行时间和结束执行时间都随机。但一般在这个代码中,main应该更快一步。因为当我们创建t线程的时侯,主线程继续向下执行,我们说这两个线程在一个进程中,但是创建线程虽然不要开辟空间,但是也不是完全没有消耗,他要建立自己的pcd。所以第一次执行被main抢占先机。JAVAEE---多线程_第3张图片

当我们点开的时候会发现一个堆栈跟踪,这就是代码执行到哪里,这是对其的一个快照,即这次点击和下次点击结果可能有所不同。

线程创建的几种方式

继承Thread 重写run方法

JAVAEE---多线程_第4张图片

实现Runnable接口,重写run方法JAVAEE---多线程_第5张图片

继承Thread,重写run,但使用匿名内部类

JAVAEE---多线程_第6张图片

实现Runnable接口,重写run方法,使用匿名内部类JAVAEE---多线程_第7张图片

但是上面四种都不太常用,一般使用lambda表达式JAVAEE---多线程_第8张图片

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才真正创建了JAVAEE---多线程_第9张图片

第一个打印为false,但t已经实例过了,第二次为true因为线程没有结束,第三次为false但t仍然没有被释放,不过其线程已经结束。

你可能感兴趣的:(java,jvm,开发语言)