Java多线程

一、进程与线程
  • 程序:程序是指令和数据的有序集合,其本身没有任何运 行的含义,是一个静态的概念
  • 进程:进程是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位 。当一个程序进入内存运行时,就变成了一个进程
  • 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程
  • 三者关系:简而言之,一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少包含一个线程
二、继承Thread类创建线程
  • 创建步骤:
  1. 自定义线程类继承Thread类
  2. 重写run()方法,编写线程执行体
  3. 创建线程对象,调用start()方法启动线程
  • 案例
public class TestThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"  "+ i);
        }
    }

    public static void main(String[] args) {
        new TestThread().start();
        new TestThread().start();
    }
}

运行结果:

java 动态创建 task java动态创建线程_创建线程

三、实现Runnable接口创建线程
  • 创建步骤
  1. 定义Runnable接口实现类
  2. 重写run()方法,编写线程执行
  3. 创建线程对象,调用start()方法启动线程
  • 案例
public class TestRunnable implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"  "+ i);
        }
    }

    public static void main(String[] args) {
        TestRunnable runnable = new TestRunnable();
        new Thread(runnable).start();
        new Thread(runnable).start();
    }
}

运行结果:

java 动态创建 task java动态创建线程_Boo_02

四、实现Callable接口创建线程
  • 创建步骤
  1. 实现Callable接口,需要返回值类型
  2. 重写call方法,需要抛出异常
  3. 创建目标对象
  4. 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
  5. 提交执行:Future result1 = ser.submit(t1);
  6. 获取结果:boolean r1 = result1.get()
  7. 关闭服务:ser.shutdownNow()
  • 特点
  1. call()方法可以有返回值
  2. call()方法可以声明抛出异常
  • 案例
import java.util.concurrent.*;

public class TestCallable implements Callable<Boolean> {

    @Override
    public Boolean call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"  "+ i);
        }
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestCallable testCallable = new TestCallable();

        //创建执行服务
        ExecutorService service = Executors.newFixedThreadPool(2);

        //提交执行
        Future<Boolean> submit = service.submit(testCallable);
        Future<Boolean> submit1 = service.submit(testCallable);

        //获取结果
        Boolean aBoolean = submit.get();
        Boolean aBoolean1 = submit1.get();

        //判断线程是否顺利结束或者有异常
        System.out.println(aBoolean);
        System.out.println(aBoolean1);

        //关闭服务
        service.shutdownNow();
    }
}

运行结果:

java 动态创建 task java动态创建线程_java 动态创建 task_03

五、创建线程的三种方式对比
  • 采用实现Runnable,Callable接口的方式创建多线程,还可以继承其他类,多个线程可以继承共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况
  • 采用继承Thread类的方式创建多线程,不能再继承其他父类