多线程——认识Thread类和创建线程
目录
1.Java如何定义多线程
2.线程的创建
2.1 继承 Thread,重写 run
2.2 实现 Runnable,重写 run
2.3 继承继承 Thread,重写 run,使用匿名内部类
2.4 实现 Runnable, 重写 run, 使用匿名内部类
2.5 使用 lambda 表达式
3.线程的构造方法
3.1 jconsole 查看线程
4.Thread的常见属性
1.Java如何定义多线程
上期讲到线程,已经理解线程的概念,线程和进程之间的联系以及多线程之间的相互影响。线程是操作系统中重要的概念,是进程在CPU中进行调度的基本单位。那么,怎么定义一个多线程呢?
线程是操作系统提供的概念,关于线程的操作,需要依赖操作系统提供的API。什么是API呢?API就是应用程序编程接口(Application Programming Interface),简单理解就是大佬们已经写好的一些类/函数等,我们是可以直接使用的。操作系统提供的原生API线程是使用 C语言 编写,而不同的操作系统的线程API是不一样的。
在Java中,JVM把这些操作系统提供的功能统一封装,而Java定义多线程时,用到的就是Thread类!
2.线程的创建
2.1 继承 Thread,重写 run
示例代码:
//继承Thread类,重写run
class MyThread extends Thread {@Overridepublic void run() {System.out.println("hello thread"); }
}
public class Demo1 {public static void main(String[] args) {Thread thread = new MyThread();thread.start();System.out.println("hello main"); }
}
线程的创建时,是执行 start() 方法后才会真正创建,Thread是一个类,继承这个类时,要重写 run() 方法,这样这个线程就执行了。
start() 方法是Thread类的核心方法,它的作用是向JVM申请一个新的线程,并由操作系统调度执行,如果没有 start() 方法,那么这里就只有一个线程(主线程),也就是 main 方法,那么如果不调用 run() 方法,就不会打印 hello thread。
run() 方法是新线程执行入口的方法,调用 start() 创建新线程时,run() 就开始执行,如果是直接调用它,比如 thread.run() ,那么就失去了多线程的意义,此时变成单线程顺序执行。
(关于 run 和 start 的区别放在这篇文章的末尾)
2.2 实现 Runnable,重写 run
示例代码:
class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("hello thread");}
}
public class Demo2 {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();System.out.println("h