建设单位适合去哪个网站看资料,禅城网站建设,h5开发环境,wordpress登陆网址阿华代码#xff0c;不是逆风#xff0c;就是我疯#xff0c;你们的点赞收藏是我前进最大的动力#xff01;#xff01;希望本文内容能帮到你#xff01;
目录 引入#xff1a;
一#xff1a;Thread类
1#xff1a;Thread类可以直接调用
2#xff1a;run方法
不是逆风就是我疯你们的点赞收藏是我前进最大的动力希望本文内容能帮到你
目录 引入
一Thread类
1Thread类可以直接调用
2run方法
1主线程
2Thread创建实例
3start方法
4内核
1用户态
2内核态
3危害
二线程的随机调度
1随机调度
1调度器
2“抢占式执行”
3打印结果分析
2jconsole工具
3sleep方法
4异常捕获 引入
通过前面的学习我们了解到现在主流的编程方式为多进程编程和多线程编程
在java中并不推荐使用多进程编程这种方式因为很多跟多进程编程有关的apiJava标准库中都没有提供。
但是多线程不一样操作系统给我们提供了很多api但是这些api都是C、C实现的api风格也是C/C的。所以JVM就把这些api给封装成JAVA代码能使用的api咱们就可以直接使用了嘿嘿~
补充跑起来的程序叫进程没跑起来的程序.exe可执行文件
一Thread类
class MyThread extends Thread{Overridepublic void run() {System.out.println(这就是进入该线程的入口);}
}
public class ThreadDemo1 {public static void main(String[] args) {//根据类创建实例线程实例才是真正的线程//一般用向上转型的写法Thread t new MyThread();t.start();}
} 1Thread类可以直接调用
不需要导包因为它包含在java一个很特殊的包里java.lang可以想象你写StringInt这些类的时候有没有导包没有吧Thread也是一样的 2run方法 1主线程 一个进程中至少有一个线程进程中的第一个线程就叫做“主线程”上面图片中的main方法就是主线程 2Thread创建实例 重写的run方法是另一个线程的入口相当于main函数入口根据Thread类创建实例线程实例才是真正的线程一般我们用Thread向上转型的写法不用MyTthread创建实例 注方法的重写本质上是让你可以对现有的类进行扩展 3start方法
创建完实例之后调用Thread中的start方法才会真正的调用系统的api在系统的内核中创建出线程
注当引入线程后代码就可以同时具备多个执行流了 4内核 操作系统 内核 其他配套的应用程序。内核是操作系统核心模块。 我们把把空间分为内核空间内核态和用户空间用户态 1用户态 当一些应用程序像咱们常用的qq微信浏览器爱奇艺啥的在执行一些常规操作的时候就会由操作系统提供一些已经封装好的api然后这些应用程序调用api在用户空间内完成一些常规操作这些操作可以视为“合法操作”并不会对软硬件造成什么潜在危害。 2内核态 但是有些程序需要针对软硬件资源进行操作的时候这些操作是比较危险的就需要向系统获取更高权限进入内核空间去调用相应的api 3危害 如果让程序直接操作软硬件出个什么bug之类的可能会把硬件直接干冒烟这种情况像我们学51单片机的时候经常出现芯片被烧的情况 二线程的随机调度
class MyThread2 extends Thread{Overridepublic void run() {while (true){System.out.println(run方法);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class ThreadDemo2 {public static void main(String[] args) {Thread t new MyThread2();t.start();while (true){System.out.println(main方法);//同时打印try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
} 前引我们运行上述代码观察这两个线程mainrun究竟谁先打印
——————打印结果
1随机调度
1调度器
上述代码是两个死循环但是代码执行的时候并没有报错而是在无限打印结果如上说明这是两个独立的执行流互不干扰但是这些线程执行的顺序是不一样的从打印结果上可以看出来这里涉及到操作系统中有一个在内核当中的模块——“调度器”它的实现方式类似于“随机调度”的效果
2“抢占式执行”
一个线程什么时候被调度到cpu上执行是不确定的
一个线程什么时候从cpu上下来也是不确定的
这在我前面写过的文章cpu的调度有提及线程的安全性问题当前主流的操作系统都是“抢占式执行”
3打印结果分析
可以看出先打印run的次数是比较多的。在前面我们学过线程的引入是为了解决“进程频繁创建和销毁带来的资源浪费”这一问题的同一个进程中有第一个线程创建后后面的线程创建所耗费的资源就会大大降低。
这里同样是如此main函数作为这个进程中的主线程第一个创建所耗费的资源是最多的但是也是最先被打印的后续while循环中run第一次出现的次数才更多的
注线程的创建也是需要耗费资源的第一个线程最大后续的比较少但不是没有
2jconsole工具
查看线程信息的工具 代码出问题可以在这查看 3sleep方法
1我们引入while循环达到多次实验的目次sleep方法是为了避免打印过快而引入的
2C语言中是大写的SleepJAVA中对其进行了封装所以我们用的是.sleep()括号中是填毫秒数
3在写sleep方法时会报异常这是一个受查异常必须要捕捉有两种捕捉方式——try catch / throw
interrupted被打断
在sleep1000ms这个过程中可能会被打断就会报异常
4异常捕获
在main方法中既可以使用try catch 也可以使用 throw 但是run方法中只能使用try catch这是为什么呢 重写的run方法为子类方法因为父类run方法并没有抛throw异常那子类也不能写只能是保留Override这个标签