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

第一种方法:

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

package com.dxz.thread;

import java.util.Random;
import java.util.concurrent.TimeUnit; class RunThread extends Thread {
private String runLog = "";
private String name; public RunThread(String name) {
this.name = name;
} public void run() {
try {
int time = new Random().nextInt(10);
System.out.println("sleep "+ time +" second.");
TimeUnit.SECONDS.sleep(time);
this.runLog = this.name + time;
} catch (Exception e) {
e.printStackTrace();
}
} public String getRunLog() {
return this.runLog;
}
}
package com.dxz.thread;
public class RunThreadTest { public static void main(String[] args) throws InterruptedException {
RunThread runT = new RunThread("world");
runT.start();
runT.join();
System.out.println("result:="+runT.getRunLog()); } }

结果:

sleep 3 second.
result:=world3

结果2:

sleep 2 second.
result:=world2

第二种方法:

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

package com.dxz.thread;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit; class CallThread implements Callable<String> {
private String runLog = "";
private String name; public CallThread(String name) {
this.name = name;
}
@Override
public String call() throws Exception {
try {
int time = new Random().nextInt(10);
System.out.println("sleep " + time + " second.");
TimeUnit.SECONDS.sleep(time);
this.runLog = this.name + time;
} catch (Exception e) {
e.printStackTrace();
}
return runLog;
}
}

调用类:

package com.dxz.thread;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CallThreadTest { public static void main(String[] args) throws ExecutionException {
String result = "";
ExecutorService exs = Executors.newCachedThreadPool();
ArrayList<Future<String>> al = new ArrayList<Future<String>>();
al.add(exs.submit(new CallThread("hello")));
al.add(exs.submit(new CallThread("world")));
for (Future<String> fs : al) {
try {
result += fs.get() + ",";
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("result:="+result);
} }

结果:

sleep 5 second.
sleep 3 second.
result:=hello3,world5,

Thread之四:java线程返回结果的方法的更多相关文章

  1. Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法

    代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...

  2. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  3. Java 线程安全的实现方法

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体, 程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和 ...

  4. 停止Java线程,小心interrupt()方法

    来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决 ...

  5. JAVA线程sleep和wait方法区别

    一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能 ...

  6. Java线程死锁查看分析方法

    如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole        Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输 ...

  7. 获取Java线程返回值的几种方式

    在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务. 那么怎么获取子线程返回的值呢,我这里总结了三种方式: 主线程等待. Join方法等待. 实现Call ...

  8. 【Thread】java线程之对象锁、类锁、线程安全

    说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...

  9. java基础知识回顾之java Thread类--java线程实现常见的两种方式实现Runnable接口(二)

    创建线程的第二中方式: /** *      步骤: 1定义类实现Runnable接口      2.实现Runnable接口中的run方法.      3.通过Thread类建立线程对象,并将Run ...

随机推荐

  1. JSP 导出Excel表格

    ES6语法 传入一个table的id,然后在导出excel按钮上加入一个<a href="#" id="buttonId">导出Excel</ ...

  2. 微软官网的office外接程序开发

    链接地址:https://msdn.microsoft.com/zh-cn/library/fp161347.aspx

  3. IDEA: 遇到问题Error during artifact deployment. See server log for details.详解

    IDEA 的配置确实有些烦人,完整的配置我之前发过,现在有个著名的报错: Error during artifact deployment. See server log for details. 这 ...

  4. redis集群使用Java工具类(Java jedis集群工具类)

    package com.xiaomi.weather.vote.webservices.util.redisCache; import com.google.common.base.Strings; ...

  5. 在物理机安装CentOS6.5

    这两天就要开始在用户的新服务器上部署生产环境了.之前一直都是在服务器上搭虚拟机,而在物理机上安装还是第一次. 首先是要准备启动程序.我用的U盘作为启动盘. 刻盘的操作参考 http://jingyan ...

  6. Codeforces Round #366 (Div. 2) A , B , C 模拟 , 思路 ,queue

    A. Hulk time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  7. JavaWeb中的中文编码问题

    一.为什么要编码? 1.在计算机中存储信息的最小单元是1字节,即8个bit,所以能表示的字符范围是0~255个. 2.人类要表示的符号太多,无法用1个字节来完全表示. 这就是矛盾,要解决这个矛盾,就出 ...

  8. Springboot- pagehelper使用

    1.添加pagehelper依赖 <dependency> <groupId>org.github.pagehelper</groupId> <artifac ...

  9. 利用闭包特性改写addEventListener的回调函数

    var numClicks = 0; document.addEventListener("click",function(){ alert( ++numClicks); },fa ...

  10. python基础2 - 运算符

    3. 运算符 3.1 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理四则运算 运算符 描述 实例 + 加 10 + 20 = 30 - 减 10 - 20 = -10 ...