线程 本身是 操作系统 提供的概念,且 操作系统提供 API 供程序员调用。不同的系统,提供的 API 是不同的(Windows 创建线程的 API 和 Linux 差别非常大...)
Java (JVM) 把这些系统 API 封装好了,不需要关注系统原生 API, 只需要了解好 Java 提供的这一套 API就行了 --> Thread 标准库
一. 线程的创建
1.通过继承Thread类
class MyThread extends Thread{
@Override
public void run(){
//这里写的代码,就是即将创建出的线程,要执行的逻辑
while(true){
System.out.println("hello thread");
//循环中,加上 休眠 操作,让循环每执行一次,都休息一会儿,避免 CPU 消耗过大
try {
Thread.sleep(1000);//sleep是Thread中的类方法,static修饰
} catch (InterruptedException e) {
//throw new RuntimeException(e);//抛出新的异常,且打印异常信息
e.printStackTrace();//只是打印异常信息
//实际开发中处理异常的方法有很多,不只上面两种
}
}
}
}
public class Main1 {
//调用main方法的线程称为主线程 一个进程至少一个线程-->主线程
public static void main(String[] args) {
//创建一个线程对象
MyThread t = new MyThread();
//创建并启动线程,执行run里面的代码
t.start();
//t.run()不会创建线程,依旧是在主线程中执行逻辑
//主线程
while(true){
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果:

结果解析: 多个线程之间,谁先去CPU上调度执行,这个过程是“不确定的”(不是数学意义的随机),这个调度顺序,取决于 操作系统 内核里的 “调度器”。调度器里有一套规则,但是作为应用程序的开发者 是感受不到的,也没法进行干预。决定调度执行哪一个线程的过程,是一个“抢占式执行” 的过程。
我们可以通过Java jdk 中的 bin包 下的 jconsole 查看线程情况。

堆栈跟踪 是一个程序在运行时生成的诊断信息,它显示了程序执行到当前点时,调用栈上所有活动的帧(Frame)。每个帧代表一个方法调用,堆栈跟踪能够展示哪些方法被调用,以及调用它们的顺序。当异常发生时,堆栈跟踪尤其有用,因为它可以帮助开发者追踪异常的来源,即确定异常是在哪个方法中首次被抛出的。
除了手动创建的线程和主线程, 剩下的线程,都是起到了一些辅助作用:a.

最低0.47元/天 解锁文章
2423

被折叠的 条评论
为什么被折叠?



