创建新线程
Java语言内置了多线程支持。当Java程序启动的时候,实际上是启动了一个JVM进程,然后,JVM启动主线程来执行main()
方法。在main()
方法中,我们又可以启动其他线程。
要创建一个新线程非常容易,首先需要实例化一个Thread
实例,然后覆写他的run
方法,并调用它的start()
方法:(要特别注意:直接调用Thread
实例的run()
方法是无效的),在两个进程中使用Thread.sleep(10)可以模拟并发。
// 多线程
public class Main {
public static void main(String[] args) {
System.out.println("main start...");
Thread t = new MyThread();
t.start(); // 启动新线程
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
System.out.println("main end...");
}
}
class MyThread extends Thread {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
System.out.println("thread run...");
System.out.println("thread end.");
}
}
线程的状态
在Java程序中,一个线程对象只能调用一次start()
方法启动新线程,并在新线程中执行run()
方法。一旦run()
方法执行完毕,线程就结束了。因此,Java线程的状态有以下几种:
- New:新创建的线程,尚未执行;
- Runnable:运行中的线程,正在执行
run()
方法的Java代码; - Blocked:运行中的线程,因为某些操作被阻塞而挂起;
- Waiting:运行中的线程,因为某些操作在等待中;
- Timed Waiting:运行中的线程,因为执行
sleep()
方法正在计时等待; - Terminated:线程已终止,因为
run()
方法执行完毕。 - 用一个状态转移图表示如下:

当线程启动后,它可以在Runnable
、Blocked
、Waiting
和Timed Waiting
这几个状态之间切换,直到最后变成Terminated
状态,线程终止。
线程终止的原因有:
- 线程正常终止:
run()
方法执行到return
语句返回; - 线程意外终止:
run()
方法因为未捕获的异常导致线程终止; - 对某个线程的
Thread
实例调用stop()
方法强制终止(强烈不推荐使用)。
一个线程还可以等待另一个线程直到其运行结束。例如,main
线程在启动t
线程后,可以通过t.join()
等待t
线程结束后再继续运行:
// 多线程
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
System.out.println("hello");
});
System.out.println("start");
t.start(); // 启动t线程
t.join(); // 此处main线程会等待t结束
System.out.println("end");
}
}