java创建线程4种方式

176 阅读1分钟

1.继承Thread类--不推荐

java单继承不多说,见例子

package create;

/**
 * @author: suruomo
 * @date: 2020/9/23 15:01
 * @description: 继承Thread类创建线程
 */
public class ThreadDemo {

    public static class Demo extends Thread {
        @Override
        public void run() {
            System.out.println("start");
        }
    }

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

2.实现Runnable接口

public class RunnableDemo {
    public static class Demo implements Runnable {
        @Override
        public void run() {
            System.out.println("start");
        }
    }

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

3.使用Executor框架

public class ExecutorDemo {
    public static class Demo implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+":start");
        }
    }

    public static void main(String[] args){
       Demo demo=new Demo();
       ExecutorService executorService= Executors.newFixedThreadPool(5);
       for (int i = 0; i < 5; i++) {
            executorService.submit(demo);
        }
    }
}

4.使用FutureTask

使用Callable和FutureTask,可以实现有返回值的线程创建,并且可以抛出异常

public class FutureTaskDemo implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        // 计算1-100的和
        int sum = 0;

        for (int i = 1; i <= 100; i++) {
            sum += i;
        }

        return sum;
    }

    public static void main(String[] args) {
        FutureTaskDemo demo=new FutureTaskDemo();
        // 使用Callable方式创建线程,需要FutureTask类的支持,用于接收运算结果,可以使用泛型指定返回值的类型
        FutureTask<Integer> result=new FutureTask<>(demo);
        //开启线程
        new Thread(result).start();
        int sum = 0;

        // 接收运算结果
        // 只有当该线程执行完毕后才会获取到运算结果,等同于闭锁的效果
        try {
            sum = result.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        System.out.println("sum is " + sum);
    }
}