java创建线程的5种方法

1 继承Thread类

public class CreateThread01 {

    static class Mythread extends Thread{
        @Override
        public void run() {
            System.out.println("线程创建的第一种方法");
        }
    }


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

2 实现Runable接口

static class MyRun implements Runnable{

        @Override
        public void run() {
            System.out.println("线程创建的第二种方法");
        }
    }

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

3 使用lambda表达式

new Thread(()->{
            System.out.println("线程创建的第三种方法");
        }).start();

4 实现Callable接口

static class MyCall implements Callable<String>{

        @Override
        public String call() throws Exception {
            System.out.println("线程创建的第四种方法");
            return "线程创建的第四种方法";
        }
    }

    public static void main(String[] args) {
        new Mythread().start();
        new Thread(new MyRun()).start();
        new Thread(()->{
            System.out.println("线程创建的第三种方法");
        }).start();

        Thread thread = new Thread(new FutureTask<String>(new MyCall()));
        thread.start();
    }

5使用线程池

ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.execute(()->{
            System.out.println("使用线程池创建线程");
        });
        executorService.shutdown();
    }

用线程池执行线程

ExecutorService executorService = Executors.newSingleThreadExecutor();


        Future<String> submit = executorService.submit(new MyCall());
        String s = submit.get();
        System.out.println(s);

执行 execute()方法和 submit()方法的区别是什么呢?

  1. execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;
  2. submit()方法用于提交需要返回值的任务。线程池会返回一个 Future 类型的对象,通过这个 Future 对象可以判断任务是否执行成功,并且可以通过 Future 的 get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用 get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。

实现 Runnable 接口和 Callable 接口的区别

Runnable自 Java 1.0 以来一直存在,但Callable仅在 Java 1.5 中引入,目的就是为了来处理Runnable不支持的用例。Runnable 接口 不会返回结果或抛出检查异常,但是 Callable 接口 可以。所以,如果任务不需要返回结果或抛出异常推荐使用 Runnable 接口 ,这样代码看起来会更加简洁。

经验分享 程序员 微信小程序 职场和发展