创建线程的方式

一般来说,创建线程有三种方式:继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。

继承 Thread 类:继承 Thread 类,重写 run() 方法,调用 start() 方法启动线程。

public class MyThread {

    public static class MyThreadTest1 extends Thread {
        @Override
        public void run() {
            System.out.println("继承 Thread 类");
        }
    }

    public static void main(String[] args) {
        MyThreadTest1 myThreadTest1 = new MyThreadTest1();
        myThreadTest1.start();

    }

}

实现 Runnable 接口:实现 Runable 接口,重写 run() 方法。

public class Mythread2 implements Runnable {

    @Override
    public void run() {
        System.out.println("实现 Runnable 接口");
    }

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

}

可以看到以上两种方式都是在调用 start() 方法时调用了 run() 方法,那为什么不能直接去调用 run() 方法呢?其实以上这两种方式如果直接调用 run() 方法的时候也是能成功执行的。

JVM 在执行 start() 方法时,会先创建一个新线程,由创建出来的新线程去执行 Thread 的 run() 方法,这才起到多线程的效果。如果直接调用 Thread 的 run() 方法,那么 run() 方法还是运行在主线程中,相当于顺序执行,就起不到多线程的效果。

以上这两种创建线程的方法都是没有返回值的,如果我们需要关注线程执行结果的话,就需要第三种创建线程的方式。

实现 Callable 接口:实现 Callable 接口,重写 call() 方法,这种方式可以通过 FutureTask 获取任务执行的返回值。

public class MyThread3 implements Callable {

    @Override
    public Object call() throws Exception {
        return "实现 Callable 接口";
    }

    public static void main(String[] args) {
        //创建异步任务
        FutureTask<String> task=new FutureTask<String>(new MyThread3());
        //启动线程
        new Thread(task).start();
        try {
            //等待执行完成,并获取返回结果
            String result = task.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

本文参考自:面渣逆袭:Java并发六十问,快来看看你会多少道! - 掘金

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值