进程的概念
通俗来讲,启动电脑中的一个 exe 文件就叫启动一个进程。“进程是一个静态的概念”,在我们机器中实际上运行的都是线程。Linux 和 Widows 都是支持多进程多线程的操作系统,DOS 只支持单线程
线程的概念
引用马士兵老师的解释:“线程是一个程序中不同的执行路径”
示例
- public class Test {
- public static void main(String[] args) {
- m1();
- }
- static void m1() {
- m2();
- m3();
- }
- static void m2() {}
- static void m3() {}
- }
分析上面程序的执行路径有几条上图就是程序执行的顺序,只有一条路径,所以这个程序是单线程的
在一个时间点内,一个 CPU 只支持一个线程运行,只不过 CPU 运行速度很快,所以感觉是多线程运行
- Main 方法也叫主线程
- Java 的线程是通过 java.lang.Thread 类来实现的
- JVM 启动时会有一个主方法 public static void main () 所定义的线程
- 可以通过创建 Thread 的实例来创建新的线程
- 每个线程都是通过某个特定的 Thread 对象所对应的 run () 方法来完成操作的,方法 run () 称为线程体
- 可以通过调用 Thread 类的 start () 方法来启动一个线程
线程的创建和启动
有两种方式创建新的线程
第一种
- 定义线程类实现 Runnable 接口
- Thread myThread = new Thread (target) target 为 Runnable 接口类型
- Runnable 中只有一种方法:public void run (): 用于定义线程运行体
- 使用 Runnable 接口可以为多个线程提供共享的数据
- 在实现 Runnable 接口的类的 run 方法定义中可以使用 Thread 的静态方法:public static Thread currentThread () 获取当前线程的引用
第二种
- 可以定义一个 Thread 的子类并重写其 run 方法
- class MyThread extends Thread{
- public void run(){
- ...
- }
- }
通过实现 Runnable 接口实现线程创建
- public class TestThread1{
- public static void main(String[] args){
- Runner1 r = new Runner1();//创建了一个线程
- Thread t = new Thread(r);//准备启动一个线程
- t.start();
- for(int i = 0;i < 100;i++)
- System.out.println("Main Thread:-------" + i);
- }
- }
- class Runner1 implements Runnable{
- public void run(){
- for(int i = 0;i < 100;i++)
- System.out.println("Runner1:" + i);
- }
- }
运行结果如下图所示:可以看到,两条输出交错打印,实现了多线程,用一个图来表示线程的运行过程:
这两个线程其实是交替在执行,或者说并行运行
下面再看一个代码
- public class TestThread1{
- public static void main(String[] args){
- Runner1 r = new Runner1();
- r.run();
- for(int i = 0;i < 100;i++)
- System.out.println("Main Thread:-------" + i);
- }
- }
- class Runner1 implements Runnable{
- public void run(){
- for(int i = 0;i < 100;i++)
- System.out.println("Runner1:" + i);
- }
- }
执行这个代码会先打印 Runner1 中的所有输出语句,然后再打印 Main 中的输出语句,这不叫创建线程,这个叫方法调用,两者是天壤之别
通过继承 Thread 类实现线程创建
- public class TestThread1 {
- public static void main(String[] args) {
- Runner1 r = new Runner1();
- r.start();
- for(int i = 0;i < 100;i++)
- System.out.println("Main Thread:-------" + i);
- }
- }
- class Runner1 extends Thread{
- public void run(){
- for(int i = 0;i < 100;i++)
- System.out.println("Runner1:" + i);
- }
- }
总结
要实现多线程,必须实例化 Thread 类,调用其 start () 方法
两种创建线程的方式,推荐使用实现接口的方式,如果使用继承的方式就不能再继承其他的类,但是实现接口可以