• 带返回值的线程


      创建一个线程有几种方式,很容易想到的就是集成Thread类,实现Runnable接口,还有一种方式就是自己定义的线程类实现Callable接口,这种方式相较于实现Runnable接口具有带有返回值的特点,大家都知道在java中主线程中创建的线程可以独立于主线程执行,也就是说main函数结束了。在main函数中产生的线程还在继续执行,如果希望主线程在所有子线程都结束再结束,该怎么做呢?可以试想这样一种场景:创建了50个线程,每个线程计算10000个数字之和,最后计算出总和。如果线程继承了Runnable接口,每个线程就无法把结果返回,或许回想到使用全局变量来定义五十万个数字的和,每个线程对这个全局变量进行操作,并通过锁机制控制线程安全。这种方式还需要考虑一个问题就是,最后的结果怎么输出?可以在主线程输出嘛~,但是此时就涉及到主线程等待子线程的问题了?但是使用实现了Callable接口的线程类,就可以很优美的解决以上问题,让每个线程类计算自己负责的部分,然后得出自己的结果,刚才有说,实现了Callable接口的线程可以返回结果,这样我们就可以在主线程中将结果取出,此时取出结果的方法是个阻塞的方法,也就是该子线程如果没有获得结果会让主线程一直等待在那里,这样我们把每个线程的值取出后在主线程中计算出总和,最后输出,这样简单明了。下面一个简单的例子可以看出Callable如何使用,Callable还有其他特点,有兴趣可以自行查阅。

    /** Callable接口支持泛型,此处设置返回值类型为String*/

    public class ClientThread implements Callable<String>{

    /** 实现Runnable要复写run方法,但实现Callable接口需要复写call方法*/
    @Override
    public String call() {
      /** 此处写你的逻辑处理*/

      StringBuilder builder = new StringBuilder();

      for(int i = 0; i < 4; i++)

      {

        builder.append((int)(Math.random()*10 + 1));  //产生1~9的随机数;

      }

      return builder.toString();
    }

    public Class Test{  

      public static void main(String[] args)
      {
        List<Future<String>> list = new ArrayList<Future<String>>();  //Future<String>是线程池执行后产生的结果类型,通过该类型的对象可以获取线程的返回的值
        ExecutorService pool = Executors.newFixedThreadPool(10);  //线程池,产生10个线程备用
        for(int i = 0; i < 10; i++)
        {
          ClientThread ct = new ClientThread();
          list.add(pool.submit(ct));
        }
        for(Future<String> f : list)
        {
          try {

              /** 该方法让主线程阻塞,等待子线程返回结果*/
              System.out.println(f.get()); 
             } catch (InterruptedException | ExecutionException e) {
              log.error("在将线程结果带出时出错");
             }
        }
        pool.shutdownNow();
      }

    }

    关于线程池的使用方式不了解的可以百度一下。

  • 相关阅读:
    【算法总结】搜索算法(上)
    New Beginning
    好想退役啊【笑
    【NOIP2012】DAY1+DAY2题解
    【NOIP2013】Day2不完全题解+代码
    【NOIP2013】DAY1题解+代码
    【NOIP2014】DAY2题解+代码
    【游记】NOIP2015造纸记
    【ACM-ICPC 2018 徐州赛区网络预赛】E. End Fantasy VIX 血辣 (矩阵运算的推广)
    【ACM-ICPC 2018 沈阳赛区网络预赛】不太敢自称官方的出题人题解
  • 原文地址:https://www.cnblogs.com/shellpicker/p/11406230.html
Copyright © 2020-2023  润新知