java多线程返回函数结果

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

第一种方法:

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

[java] view plaincopy

  1. class RunThread extends Thread{
  2. private String runLog;
  3. private BufferedReader br;
  4. {
  5. runLog = "";
  6. }
  7. public RunThread(BufferedReader br){
  8. this.br = br;
  9. }
  10. public void run() {
  11. try {
  12. String output = "";
  13. while ((output = br.readLine()) != null) {
  14. this.runLog += output + "\n";
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. public String getRunLog(){
  21. return this.runLog;
  22. }
  23. }

第二种方法:

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

[java] view plaincopy

  1. class CallThread implements Callable<String>{
  2. private String runLog;
  3. private BufferedReader br;
  4. {
  5. runLog = "";
  6. }
  7. public CallThread(BufferedReader br){
  8. this.br = br;
  9. }
  10. @Override
  11. public String call() throws Exception {
  12. try {
  13. String output = "";
  14. while ((output = br.readLine()) != null) {
  15. runLog += output + "\n";
  16. }
  17. } catch (IOException e) {
  18. return runLog;
  19. }
  20. return runLog;
  21. }
  22. }

下面就来调用了。

第一种方式的调用代码:

[java] view plaincopy

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

第二种方式的调用代码:

[java] view plaincopy

    1. ExecutorService exs = Executors.newCachedThreadPool();
    2. ArrayList<Future<String>> al = new ArrayList<Future<String>>();
    3. al.add(exs.submit(new CallThread(standout)));
    4. al.add(exs.submit(new CallThread(standerr)));
    5. for(Future<String> fs:al){
    6. try {
    7. runLog += fs.get() + "\n";
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. } catch (ExecutionException e) {
    11. e.printStackTrace();
    12. }
    13. }
时间: 2024-10-24 01:56:50

java多线程返回函数结果的相关文章

java_ java多线程返回函数结果

两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里把最后的结果传递给实例变量,然后通过getXX方法获取该实例变量的值.继承实现的代码: class RunThread extends Thread{ private String runLog; private BufferedReader br; { runLog = ""; } pu

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

java多线程返回处理结果,并终止所有线程

一.概述 同时并发的按照不同的方式处理数据,需要对处理后的结果在处理或用作响应第三方请求. 这时候,有两种常见的需求. 第一种,只要有一个处理有结果,就立刻结束其他还在运行中的处理方式 第二种,等待所有处理有结果后再处理 二.处理方案 1.线程处理返回结果 一般开发中,使用多线程,最常见的就是:1.实现Runnable接口:2.继承Thread类. 但是run方法是没有返回结果,很难满足我们的需求.这时,常用的办法就是实现Callable接口 Callable接口提供了一个call方法入口,我们

java多线程--join函数

1. join()介绍 join() 定义在Thread.java中. join() 的作用:让"主线程"等待"子线程"结束之后才能继续运行.这句话可能有点晦涩,我们还是通过例子去理解: // 主线程 public class Father extends Thread { public void run() { Son s = new Son(); s.start(); s.join(); ... } } // 子线程 public class Son exten

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

java多线程之从任务中获取返回值

package wzh.test; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class TaskWithResult implements Callable<Strin

java 多线程 获取线程返回结果

我们在使用java多线程编写相关业务代码时,往往有这样一种情况,某个线程依赖于其他线程执行结果. 也就是说,我们需要在一个线程中获取另一个线程的信息.可以分为两种情况,一种是轮询,一种是回调,因为轮询效率很低,所以本文主要介绍回调方法. 回调的主要思想是:线程run方法执行结束时,主动通知main线程,在main线程中做相应处理.通知main线程可以通过调用main方法中的static方法实现. 假定以下场景: 两个线程读取两个不同文件,最后拼接两个文件内容输出. 1.以下是线程代码: 1 pa

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27