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 接口 ,这样代码看起来会更加简洁。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值