多线程基础
进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。
操作系统调度的最小任务单位其实不是进程,而是线程。
实现多任务的三种方法:
-
多进程,每个进程只有一个线程
-
多线程,一个进程有多个线程
-
多进程 + 多线程
进程与线程的优缺点
和多线程相比,多进程的缺点在于:
-
创建进程比创建线程开销大,尤其是在Windows系统上;
-
进程间通信比线程间通信要慢,因为线程间通信就是读写同一个变量,速度很快。
多进程的优点在于:
- 多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃会直接导致整个进程崩溃。
多线程
JAVA 语言内置了多线程支持:一个 Java 程序实际上就是一个 JVM 进程。
JVM 进程用一个主线程来执行 main() 方法,在 main() 方法内部,我们又可以启动多个线程。
因此,对于大多数 Java 程序来说,我们说多任务,实际上是说如何使用多线程实现多任务。
java 多线程编程的特点:
-
多线程模型是 java 程序最基本的并发模型
-
读写网络、数据库、web开发等都依赖 java 多线程模型
创建新线程
创建一个新线程需要实例化一个 Thread
实例,然后调用它的start()
方法:
public class Main {
public static void main(String[] args){
Thread thread = new Thread();
thread.start(); //启动新线程
}
}
但是这个线程启动后实际上什么也不做就立刻结束了。我们希望新线程能执行指定的代码。
具体方法如,从Thread派生一个自定义类,然后覆写run()方法:
public class Main {
public static void main(String[] args) {
Thread t = new MyThread();
t.start(); // 启动新线程
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("start new thread!");
}
}
当使用t.start()
启动新线程时,会在内部自动调用实例的run()
方法。
线程的状态
在 Java 程序中,一个线程对象只能调用一次 start() 方法启动新线程,并在新线程中执行 run() 方法。一旦 run() 方法执行完毕,线程就结束了。
因此,Java线程的状态有以下几种:
-
New:新创建的线程,尚未执行;
-
Runnable:运行中的线程,正在执行run()方法的Java代码;
-
Blocked:运行中的线程,因为某些操作被阻塞而挂起;
-
Waiting:运行中的线程,因为某些操作在等待中;
-
Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待;
-
Terminated:线程已终止,因为run()方法执行完毕。
通过对另一个线程对象调用 join() 方法可以等待其执行结束;
每天学习一点点,每天进步一点点。