多线程-创建多线程的几种方式

168 阅读1分钟
  • 程序是一个静态的概念。
  • 进程是程序的一次执行过程,动态的。是系统资源分配的单位。
  • 一个进程可以包含若干个线程,线程是CPU调度和执行的单位。是独立的执行路径。

在只有一个CPU的前提下,同一个时间点,CPU只能执行一个代码,因为切换速度快,所以会出现同时执行的错觉。

线程不一定立即执行,由CPU调度。

创建线程的多种方法

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口

1.继承Thread类

/**
 * 1. 继承Thread类 -> 重写run方法
 *
 */
class Thread1 extends Thread {

    @Override
    public void run() {
        System.out.println("1. 继承Thread类 -> 重写run方法:" + this.getName());
    }
}
// 启动线程
// 1. 继承Thread类
Thread thread1 = new Thread1();
thread1.start();
// 或者
// Thread1 tt = new Thread1();
// tt.start();

2.实现Runnable方法

避免单继承局限性

/**
 * 2. 实现Runnable接口 -> 重写run方法
 */
class Thread2 implements Runnable {
    @Override
    public void run() {
        System.out.println("2. 实现Runnable接口 -> 重写run方法:" + Thread.currentThread().getName());
    }
}
// 2. 实现Runnable接口
Thread2 runnable = new Thread2();
Thread thread2 = new Thread(runnable);
thread2.start();

3.实现Callable接口

需要返回值类型

重写call(), 需要抛出异常

/**
 * 3. 实现Callable接口 -> 重写call方法
 */
class Thread3 implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("3. 实现Callable接口 -> 重写call方法:" + Thread.currentThread().getName());
        return "call()返回参数";
    }
}
// 3. 实现Callable接口
FutureTask<String> futureTask = new FutureTask<>(new Thread3());
new Thread(futureTask).start();
// 需捕获异常
System.out.println(futureTask.get());