Thread之四:java线程返回结果的方法
两种方式:一种继承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线程返回结果的方法的更多相关文章
- Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法
代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...
- 模拟做饭系统(java+线程中的join方法)
(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...
- Java 线程安全的实现方法
概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体, 程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和 ...
- 停止Java线程,小心interrupt()方法
来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决 ...
- JAVA线程sleep和wait方法区别
一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能 ...
- Java线程死锁查看分析方法
如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输 ...
- 获取Java线程返回值的几种方式
在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务. 那么怎么获取子线程返回的值呢,我这里总结了三种方式: 主线程等待. Join方法等待. 实现Call ...
- 【Thread】java线程之对象锁、类锁、线程安全
说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...
- java基础知识回顾之java Thread类--java线程实现常见的两种方式实现Runnable接口(二)
创建线程的第二中方式: /** * 步骤: 1定义类实现Runnable接口 2.实现Runnable接口中的run方法. 3.通过Thread类建立线程对象,并将Run ...
随机推荐
- CCNA 课程 三
交换机的MAC地址学习情况: 1.从一个接口收到数据帧,根据数据帧的原mac地址查找交换机的mac地址表,如果没有找到,将会添加数据帧的原mac地址和收到数据帧接口的对应条目,放进交换机的mac地址表 ...
- 使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- linux下常用FTP命令 1. 连接ftp服务器[转]
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- 考勤助手ER图2.0版本所存在的问题
如图所示,考勤助手ER图2.0版本中,缺少个人信箱这一问题虽然不具有逻辑层面的问题,但是它是不满足需求的,也就是说这样的设计无法满足小组对考勤助手最初的设计.其次,就设计层面来分析,弱联系是数据库查询 ...
- 判断A字符串是B字符串的反转
先将其中一个字符串进行反转操作,然后两个字符串进行判断. 1.反转 /** * 字符串反转 * @param str * @return */ private static String conver ...
- Redis学习路线
[http://www.cnblogs.com/zhenjing/archive/2012/11/15/redis_research.html] Redis: A persistent key-val ...
- alias 中使用awk
alias hehistory10='history |awk "{print \$2}"|sort|uniq -c|sort -rn|head -10' $要转义
- MVC3 ajax功能
微软mvc3框架的项目使用微软自带的ajax 必须引用下面 <script src="/Scripts/jquery.unobtrusive-ajax.js" type=&q ...
- tlflearn 编码解码器 ——数据降维用
# -*- coding: utf-8 -*- """ Auto Encoder Example. Using an auto encoder on MNIST hand ...
- git教程2-删除修改和文件
文件处于三种状态: 1.位于工作区,未修改状态: 2.位于工作区,已经修改状态: 3.位于暂存区,已经暂存但未commit. 4.已经commit. 一.文件删除修改: 1.已经修改,但未add: g ...