创建多线程的三种方式和区别

方式一:继承Thread类 

1.自定义一个类继承Thread类;

2.重写Thread类中的run方法(自定义线程的任务代码就放在run方法里);

3.创建Thread子类的对象,并且调用start方法开启线程,(run方法不能直接调用)

 

示例:

class Demo extends Thread{

   

    public void run(){    //重写run方法

        for(int i=0;i<100;i++){

            System.out.println("自定义线程"+i)

        }

    }

 

    public static void main(String[] args){

 

         Demo d = new Demo();

         d.start();   //调用start方法开启线程

         for(int i=0;i<100;i++){ 

            System.out.println("main线程"+i)

        }

    }

 

方式二:实现Runnable接口

Thread类中有构造方法,可以传递Runnable实例。

 示例:

 

class Demo1 implements Runnable{

    public void run(){    //重写run方法

        for(int i=0;i<100;i++){

            System.out.println("自定义线程"+i)

        }

    }

 

    public static void main(String[] args){

 

         Demo d = new Demo();

         Thread thread = new Thread(d);

         thread .start();   //调用start方法开启线程

        

         for(int i=0;i<100;i++){ 

            System.out.println("main线程"+i)

        }

    }

}

 

继承Thread和实现Runnable的区别:

前者是创建不同任务类实例执行各个线程,不能共享数据;

后者是一个任务类实例创建不同线程传入同一任务类实例,共享资源。

 

 

方式三:实现Callable接口

  Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

 

* Callable和Runnable有几点不同:

 

* (1)Callable规定的方法是call(),而Runnable规定的方法是run().

 

* (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

 

* (3)call()方法可抛出异常,而run()方法是不能抛出异常的,只能在内部消化。

 

* (4)运行Callable任务可拿到一个Future对象, Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

 

public class MyCallable implements Callable<Integer>{

 

    @Override

    public Integer call() throws Exception {

        int sum = 0;

        for(int i = 0;i<10;i++){

            sum+=i;

        }

        return sum;

    }

}

 

public class CallableTest {

   

    public static void main(String[] args) throws Exception{

        /*// 第一种方式:通过线程池来获取线程

        ExecutorService executor = Executors.newCachedThreadPool();//创建线程池

        Future<Integer> future = executor.submit(new MyCallable());//ExecutorService中的submit方法接受一个Runnable或者Callable,然后返回一个Future来获得任务的执行结果或者取消任务。

        System.out.println("result:" + future.get());

        executor.shutdown();*/

       

        //第二种方式

        MyCallable mc = new MyCallable();

        FutureTask<Integer> futureTask = new FutureTask<Integer>(mc);       

        Thread thread = new Thread(futureTask);

        thread.start();

        System.out.println("result:" + futureTask.get());

    }

}

注意: future.get()和futureTask.get()方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!

 

Callable、Future和FutureTask三个类的具体实现见如下文章连接:https://www.cnblogs.com/dolphin0520/p/3949310.html

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙糖橘

您的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值