zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Macaca初体验-Android端(Python)
    Macaca初体验-Android端(Python)
    Macaca初体验-Android端(Python)
    什么是流媒体技术
    什么是流媒体技术
    什么是流媒体技术
    什么是流媒体技术
    设备可以和人说话了 就问你怕不怕?
    设备可以和人说话了 就问你怕不怕?
    你都有什么副业?
  • 原文地址:https://www.cnblogs.com/cphmvp/p/3735015.html
Copyright © 2011-2022 走看看