java 教程——线程,整合 springboot 集成实现动态刷新配置
多线程模型是 Java 程序最基本的并发模型;
后续读写网络、数据库、Web 开发等都依赖 Java 多线程模型。
因此,必须掌握 Java 多线程编程才能继续深入学习其他内容。
创建新线程
=====
方法一:从Thread
派生一个自定义类,然后覆写run()
方法:
package test;
public class changeData {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
public static class MyThread extends Thread{
@Override
public void run() {
System.out.println("我来自子线程");
}
}
}
方法二:创建Thread
实例时,传入一个Runnable
实例:
package test;
public class changeData {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
}
private static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("我来自子线程");
}
}
}
要特别注意:直接调用
Thread
实例的run()
方法是无效的:
直接调用
run()
方法,相当于调用了一个普通的 Java 方法,当前线程并没有任何改变,也不会启动新线程。上述代码实际上是在main()
方法内部又调用了run()
方法,打印hello
语句是在main
线程中执行的,没有任何新线程被创建。
必须调用
Thread
实例的start()
方法才能启动新线程,如果我们查看Thread
类的源代码,会看到start()
方法内部调用了一个private native void start0()
方法,native
修饰符表示这个方法是由 JVM 虚拟机内部的 C 代码实现的,不是由 Java 代码实现的。
线程的优先级
======
可以对线程设定优先级,设定优先级的方法是:
Thread.setPriority(int n) // 1~10, 默认值 5
优先级高的线程被操作系统调度的优先级较高,操作系统对高优先级线程可能调度更频繁,但我们决不能通过设置优先级来确保高优先级的线程一定会先执行。
线程的状态
=====
在 Java 程序中,一个线程对象只能调用一次start()
方法启动新线程,并在新线程中执行run()
方法。一旦run()
方法执行完毕,线程就结束了。因此,Java 线程的状态有以下几种:
New:新创建的线程,尚未执行;
Runnable:运行中的线程,正在执行
run()
方法的 Java 代码;Blocked:运行中的线程,因为某些操作被阻塞而挂起;
Waiting:运行中的线程,因为某些操作在等待中;
Timed Waiting:运行中的线程,因为执行
sleep()
方法正在计时等待;Terminated:线程已终止,因为
run()
方法执行完毕。
用一个状态转
移图表示如下:
线程终止的原因有:
评论