两种方式:一种继承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. Go Mysql驱动

    Golang中MYSQL驱动 Mysql库https://github.com/go-sql-driver/mysql Go本身不提供具体数据库驱动,只提供驱动接口和管理. 各个数据库驱动需要第三方实 ...

  2. hive -e 时转义需要再加一个\

    hive窗口中使用转义字符: select split(concat_ws('|','123','456','789'),'\\|')from dual; 参考 http://jingyan.baid ...

  3. java深入探究12-框架整合

    1.Spring与Hibernate整合 需要配置的就是hibernate和bean.xml 1)关键点:sessionFactory创建交给SpringIOC:session的事务处理交给Sprin ...

  4. C#将字符转换成utf8编码 GB321编码转换

    public static string get_uft8(string unicodeString) { UTF8Encoding utf8 = new UTF8Encoding(); Byte[] ...

  5. Java JDK、Tomcat、Eclipse环境配置

    Java 下载地址:http://www.oracle.com/ 根据提示一步一步进行安装,通常安装到C:\Program Files\Java,包含: 环境变量配置: JAVA_HOME:C:\Pr ...

  6. html5 pc端参考网址

    http://huodong.baidu.com/zhuanpan/?SEM&PC&refer=107255

  7. C#中List<object>.Clear()方法和实例化new List<object>()操作的结果分析

    本文主要的目的是想简单的探讨一下C#中List针对内存的操作过程,以便以后遇到该种情况可以避免走进误区,内容非常简单,只是在此作为记录.能帮到人最好,帮不到就当给自己提个醒.C#将复杂的指针操作全都隐 ...

  8. Python爬虫之BeautifulSoup的用法

    之前看静觅博客,关于BeautifulSoup的用法不太熟练,所以趁机在网上搜索相关的视频,其中一个讲的还是挺清楚的:python爬虫小白入门之BeautifulSoup库,有空做了一下笔记: 一.爬 ...

  9. linux 部署python

    tar xf Python-.tar.xz cd Python-./configure make make install ln -s /usr/local/bin/python2. /usr/bin ...

  10. Git_学习_09_Commit message 和 Change log 编写指南

    一.前言 二.Commit message编写 1.规范 2.用空行分开主题和正文 提交时只执行 git commit,这时就会跳出文本编辑器,让你写多行. git commit 主题和正文分开 每次 ...