• java_ java多线程返回函数结果


    两种方式:一种继承Thread类实现;一种通过实现Callable接口。

    第一种方法:

    因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里把最后的结果传递给实例变量,然后通过getXX方法获取该实例变量的值。继承实现的代码:

    class RunThread extends Thread{  
        private String runLog;
        private BufferedReader br;
        {
            runLog = "";
        }
        public RunThread(BufferedReader br){
            this.br = br;
        }
        public void run() {
            try {  
                String output = "";
                while ((output = br.readLine()) != null) {  
                    this.runLog += output + "
    ";  
                }    
            } catch (IOException e) {
                e.printStackTrace();
            } 
        }    
        public String getRunLog(){
            return this.runLog;
        }
    } 

    第二种方法:

    继承Callable接口后需要实现call方法,而call方法默认是可以有返回值的,所以可以直接返回想返回的内容。接口的实现代码:

    class CallThread implements Callable<String>{  
        private String runLog;
        private BufferedReader br;
        {
            runLog = "";
        }
        public CallThread(BufferedReader br){
            this.br = br;
        }
        @Override
        public String call() throws Exception {
            try {  
                String output = "";
                while ((output = br.readLine()) != null) {  
                    runLog += output + "
    ";  
                }              
            } catch (IOException e) {               
                return runLog;            
            } 
            return runLog;
        }      
    }  

    下面就来调用了。

    第一种方式的调用代码:

            RunThread th1 = new RunThread(standout);
            th1.start();                                   
            RunThread th2 = new RunThread(standerr);
            th2.start();
            th2.join();    //保障前面2个线程在主进程之前结束,否则获取的结果可能为空或不完整                                
            runLog += th1.getRunLog() + "
    ";
            runLog += th2.getRunLog() + "
    "; 

    第二种方式的调用代码:

                ExecutorService exs = Executors.newCachedThreadPool();  
                ArrayList<Future<String>> al = new ArrayList<Future<String>>();   
                al.add(exs.submit(new CallThread(standout)));  
                al.add(exs.submit(new CallThread(standerr)));            
                for(Future<String> fs:al){  
                    try {  
                        runLog += fs.get() + "
    ";  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    } catch (ExecutionException e) {  
                        e.printStackTrace();  
                    }  
                }  

    转载:http://blog.csdn.net/five3/article/details/11592889

  • 相关阅读:
    LeetCode #1021. Remove Outermost Parentheses 删除最外层的括号
    使用Maven运行测试提示Module sdk 1.5的解决方法
    Map.Entry使用详解
    c++基础(一)
    Python_正则表达式
    使用PIL生成验证码
    OpenCV_图像平滑
    OpenCV—图像阈值
    OpenCV形状变换
    使用OpenCV读写图片
  • 原文地址:https://www.cnblogs.com/cphmvp/p/3735015.html
Copyright © 2020-2023  润新知