Skip to content

1.继承Thread

  • 优点:代码编写最简单直接操作
  • 缺点:没返回值,继承一个类后,没法继承其他的类,拓展性差
java
public class test1 {

    public static void main(String[] args) {
        MyTask task = new MyTask();
        task.setName("task demo");
        task.start();
        System.out.println("主线程名称:" + Thread.currentThread().getName());
    }

    static class MyTask extends Thread {
        @Override
        public void run() {
            System.out.println("继承Thread实现多线程,名称:" + Thread.currentThread().getName());
        }
    }
}

2.实现Runnable

  • 优点:线程类可以实现多个几接口,可以再继承一个类
  • 缺点:没返回值,不能直接启动,需要通过构造一个Thread实例传递进去启动
java
public class test1 {

    public static void main(String[] args) {
        MyTask task = new MyTask();
        Thread thread = new Thread(task);
        thread.setName("task demo");
        thread.start();
        System.out.println("主线程名称:" + Thread.currentThread().getName());
    }

    static class MyTask implements Runnable {
        @Override
        public void run() {
            System.out.println("继承Thread实现多线程,名称:" + Thread.currentThread().getName());
        }
    }
}

3.使用Callable和FutureTask

Future是一个接口,代表了一个异步执行的结果。接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法。

java
public class test1 {

    public static void main(String[] args) {
        // 1.创建自己定义的MyTask对象
        MyTask task = new MyTask();
        // 2.创建FutureTask
        FutureTask<String> futureTask = new FutureTask<>(task);
        // 3.创建线程启动
        Thread thread = new Thread(futureTask);
        thread.setName("task demo");
        thread.start();
        System.out.println("主线程名称:" + Thread.currentThread().getName());
    }

    static class MyTask implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("通过Callable实现多线程,名称:" + Thread.currentThread().getName());
            return "这是返回值";
        }
    }
}

4.使用线程池

创建一个固定容量为3的线程池

java
public class test1 {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for(int i=0;i<10;i++){
            executorService.execute(new MyTask());
        }
        System.out.println("主线程名称:" + Thread.currentThread().getName());
    }

    static class MyTask implements Runnable {
        @Override
        public void run() {
            System.out.println("继承Thread实现多线程,名称:" + Thread.currentThread().getName());
        }
    }
}

观测控制台输出情况

html
主线程名称:main
继承Thread实现多线程,名称:pool-1-thread-3
继承Thread实现多线程,名称:pool-1-thread-2
继承Thread实现多线程,名称:pool-1-thread-1
继承Thread实现多线程,名称:pool-1-thread-3
继承Thread实现多线程,名称:pool-1-thread-2
继承Thread实现多线程,名称:pool-1-thread-3
继承Thread实现多线程,名称:pool-1-thread-1
继承Thread实现多线程,名称:pool-1-thread-3
继承Thread实现多线程,名称:pool-1-thread-2
继承Thread实现多线程,名称:pool-1-thread-1