java callable接口_Java多线程之Callable接口的实现有返回值的线程

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

//在主线程获取callable线程返回值时,如果callable线程还存在线程没有执行完,则主线程会等待callable线程全部执行完毕获取所有的返回值之后才会继续执行下面的代码。如果任务已经完成,get会立即返回或者抛出一个Exception,如果任务没有完成,get会阻塞知道它完成。如果任务抛出了异常。get会将改异常封装为ExecutionException.然后重新抛出。如果任务被取消,get会抛出CancellationException。当抛出ExecutionException时。可以用getCause重新获得被封装的原始异常。

/** *//**

* Callable 和 Future接口

* Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

* Callable和Runnable有几点不同:

* (1)Callable规定的方法是call(),而Runnable规定的方法是run().

* (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

* (3)call()方法可抛出异常,而run()方法是不能抛出异常的。

* (4)运行Callable任务可拿到一个Future对象,

* Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。

* 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

*/

public class CallableAndFuture {

/** *//**

* 自定义一个任务类,实现Callable接口

*/

public static class MyCallableClass implements Callable{

// 标志位

private int flag = 0;

public MyCallableClass(int flag){

this.flag = flag;

}

public String call() throws Exception{

if (this.flag == 0){

// 如果flag的值为0,则立即返回

return "flag = 0";

}

if (this.flag == 1){

// 如果flag的值为1,做一个无限循环

try {

while (true) {

System.out.println("looping.");

Thread.sleep(2000);

}

} catch (InterruptedException e) {

System.out.println("Interrupted");

}

return "false";

} else {

// falg不为0或者1,则抛出异常

throw new Exception("Bad flag value!");

}

}

}

public static void main(String[] args) {

// 定义3个Callable类型的任务

MyCallableClass task1 = new MyCallableClass(0);

MyCallableClass task2 = new MyCallableClass(1);

MyCallableClass task3 = new MyCallableClass(2);

// 创建一个执行任务的服务

ExecutorService es = Executors.newFixedThreadPool(3);

try {

// 提交并执行任务,任务启动时返回了一个 Future对象,

// 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作

Future future1 = es.submit(task1);

// 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行

System.out.println("task1: " + future1.get());

Future future2 = es.submit(task2);

//此线程是否执行完毕

future2.isDone();

// 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环

Thread.sleep(5000);

System.out.println("task2 cancel: " + future2.cancel(true));

// 获取第三个任务的输出,因为执行第三个任务会引起异常

// 所以下面的语句将引起异常的抛出

Future future3 = es.submit(task3);

System.out.println("task3: " + future3.get());

} catch (Exception e){

System.out.println(e.toString());

}

// 停止任务执行服务

es.shutdownNow();

}

}

//线程池具有返回值

package com.thread.threadpool;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.RejectedExecutionHandler;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicLong;

public class ThreadPool {

private int corePoolSize = 1; // 线程池维护线程的最少数量

private int maximumPoolSize = 10;// 线程池维护线程的最大数量

private long keepAliveTime = 3; // 线程池维护线程所允许的空闲时间

private TimeUnit unit = TimeUnit.SECONDS;// 线程池维护线程所允许的空闲时间的单位

private BlockingQueue workQueue; // 线程池所使用的缓冲队列

private RejectedExecutionHandler handler; // 线程池对拒绝任务的处理策略

private static AtomicLong along = new AtomicLong(0);

public void run() throws InterruptedException, ExecutionException {

ExecutorService pool = new ThreadPoolExecutor(corePoolSize,

maximumPoolSize, keepAliveTime, unit,

new LinkedBlockingQueue(),

new ThreadPoolExecutor.DiscardOldestPolicy()) {

// 线程执行之前运行

@Override

protected void beforeExecute(Thread t, Runnable r) {

System.out.println("...............beforeExecute");

}

// 线程执行之后运行

@Override

protected void afterExecute(Runnable r, Throwable t) {

System.out.println("...............afterExecute");

}

// 整个线程池停止之后

protected void terminated() {

System.out.println("...............thread stop");

}

};

List all = new ArrayList();

for (int i = 1; i <= 10; i++) {

all.add(pool.submit(new ThreadPoolTask(i, along)).get());

}

for (int i = 1; i <= 10; i++) {

all.add(pool.submit(new ThreadPoolTask(-i, along)).get());

}

for (Object o : all) {

System.out.println(o);

}

pool.shutdown();

Thread.sleep(25000);

System.out.println(along.get());

}

public static void main(String[] args) {

try {

try {

new ThreadPool().run();

} catch (ExecutionException e) {

e.printStackTrace();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

class ThreadPoolTask implements Callable {

private int i = 0;

private AtomicLong along;

ThreadPoolTask(int i, AtomicLong along) {

this.i = i;

this.along = along;

}

//@Override

public Object call() {

try {

// 模拟业务逻辑

Thread.sleep(1000);

along.addAndGet(i);

} catch (InterruptedException e) {

e.printStackTrace();

}

//System.out.println(Thread.currentThread().getName() + "  " + i);

return Thread.currentThread().getName() + "  " + i;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python聊天软件实现_python实现点对点聊天程序

用Python实现点对点的聊天&#xff0c;2个程序&#xff0c;一个是client.py&#xff0c;一个是server.py&#xff0c;通过本机地址127.0.0.1连接进行通信&#xff0c;利用多线程把发送消息和接收消息分开独立进行。client代码&#xff1a;import socketimport sysimport thread…

java编译器代码检查_Java编译器可以优化此代码吗?

我拥有的Java 8编译器似乎并没有对其进行优化.编译后使用“ javap -c”检查字节码&#xff1a;public static void main(java.lang.String[]);Code:0: new #2 // class java/util/Random3: dup4: invokespecial #3 // Method java/util/Random."":()V7: invokevirtua…

python中rgb_python - 图像的RGB矩阵

Taking an image as input, how can I get the rgb matrix corresponding to it?I checked out the numpy.asarray function. Does that give me the rgb matrix or some other matrix?解决方案The simplest answer is to use the NumPy and SciPy wrappers around PIL. Ther…

java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字

Java并发一、锁1. 偏向锁1. 思想背景来源&#xff1a;HotSpot的作者经过研究发现&#xff0c;大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而且总是由同 一线程多次获得&#xff0c;为了让线程获得锁的代价更低而引入了偏向锁。原理&#xff1a;在对象头和栈帧…

python 数组赋值_pythonamp;numpy的赋值

有点编程基础的童鞋看到这个标题可能会有点懵逼&#xff0c;这还是个问题吗&#xff1f;不就是个等号()解决问题嘛&#xff01;我也希望是如此简单&#xff0c;因为上个星期被这个问题折磨到崩溃&#xff01;一般的python程序需要赋值时的确是通过等号()实现的&#xff0c;不管…

java字符串匹配dp_[OI]字符串DP小结

顾名又思义&#xff0c;是在字符串上进行的DP操作。因为字符串本身可以看作是一个序列&#xff0c;所以有些时候字符串DP可以用区间DP来解决。P2246 SAC#1 - Hello World(升级版)题目描述在讲义的某一面&#xff0c;他看见了一篇文章。这篇文章由英文字母(大小写均有)、数字、和…

python打包成exe导入文件_【转载】将python脚本打包成exe文件

标签&#xff1a;exe文件也就是可以直接执行的文件。通常我们编好的带py后缀的脚本文件都是需要在有python的环境下执行&#xff0c;每次通过Win R打开运行窗口再输入powershell打开控制台,再千辛万苦地cd c:\python27 (change directory)转换目录到py文件的目录下。最终还是要…

java线上问题定位_java定位线上问题

3、jstack: Java 提供的命令。可以查看某个进程的当前线程栈运行情况。根据 这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及 是否死锁等等......A、//int a,b,c B、/** int a,b ,c */ C、{int a,b,c} */ D、/* int a,b String a */ 30、Java 目前支持…

python排名上升_TIOBE:2019年7月全球编程语言排行 Python热度继续上升

与上个月相比&#xff0c;Python 的指数又增加了不少&#xff0c;由 8.530% 上升到 9.260%。我们还留意到&#xff0c;TIOBE 对这期榜单的标题描述是“Perl is one of the victims of Python’s hype”&#xff0c;大意是说Perl 成为了过度炒作 Python 的受害者之一。TIOBE 认为…

java界面化二叉排序树_105-线索化二叉树代码实现2

2.网上数据结构和算法的课程不少&#xff0c;但存在两个问题&#xff1a;1)授课方式单一&#xff0c;大多是照着代码念一遍&#xff0c;数据结构和算法本身就比较难理解&#xff0c;对基础好的学员来说&#xff0c;还好一点&#xff0c;对基础不好的学生来说&#xff0c;基本上…

python截图识别文字代码_10几行代码,用python打造实时截图识别OCR

你一定用过那种“OCR神器”&#xff0c;可以把图片中的文字提取出来&#xff0c;极大的提高工作效率。今天&#xff0c;我们就来做一款实时截图识别的小工具。顾名思义&#xff0c;运行程序时&#xff0c;可以实时的把你截出来的图片中的文字识别出来。、&#xff01;下次&…

我的世界java 内存_我的世界如何分配内存

如果你在运行Minecraft时出现内存错误等问题&#xff0c;你可能需要给Minecraft分配更多内存来解决运行故障。如果你玩的是新版本的Minecraft&#xff0c;那么你可以从启动器里直接分配内存(RAM)。如果你使用的是旧版本&#xff0c;那么你需要创建一些文件来改变Minecraft内存使…

python数据拟合固定参数_如何将数据拟合到非理想二极管方程(隐式非线性函数)并检索参数 - python...

散乱数据图我需要将(x&#xff0c;y)-数据拟合到具有两个变量(x和y)的方程式中&#xff0c;并检索5个未知参数。我正在编写一个脚本&#xff0c;以处理来自简单.txt文件的IV数据(电流电压)&#xff0c;并将其拟合为称为非理想二极管方程的方程&#xff1b;这是一个隐式非线性函…

java学生签到系统视频教程_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...

四个阶段的Java web学生信息系统视频教程终于录制完成了&#xff0c;系统用到的知识点有&#xff1a;jspservletmysqljqueryajax&#xff0c;前端采用的是当下最流行的easyui管理框架&#xff0c;全部采用面向接口的MVC三层设计模式&#xff0c;是大家学习Java web实战项目不可…

python做网络的仿真_用python自动化仿真HFSS,超简易

python是一款适用性极强的编程语言。一直期待HFSS(三维全波电磁场仿真的行业标准)能有python接口。后知后觉的本人才发现原来HFSS16(2015版本)已经不止支持VB脚本&#xff0c;还增加了python支持&#xff0c;当然它用的是Ironpython&#xff0c;基于.NET&#xff0c;和Cpython还…

为什么网格布局不显示java_java – 在GridLayout中不显示组件的FlowLayout?

我正在创建一个应用程序,作为某种类型的中心,用户可以将快捷方式存储到他们喜欢的应用程序并轻松启动它们.不过,我在使用FlowLayout时遇到了一些问题.当我使用GridLayout时,组件显示完美.当我使用FlowLayout时,根本没有任何显示.网格布局&#xff1a;FlowLayout中&#xff1a;我…

python爬取qq音乐歌词风变编程_爬取QQ音乐歌词

#!/usr/bin/env python3# -*- coding: utf-8 -*-# DESC&#xff1a; 爬取歌手前3页歌曲的歌词都爬取下来&#xff0c;并按歌名分别保存# Date: 2020-05-21import requestsimport re,osos.makedirs(music,exist_okTrue)## 添加请求头headers {user-agent:Mozilla/5.0 (Windows …

php post请求后端拿不到值_Ajax 提交POST后,后台php 无法获取$POST值

当 contentType 为 application/x-www-form-urlencoded 时(默认值)才能用 $_POST 得到传入的数据。但是使用 application/json;charsetutf-8不是 php 所能识别的类型声明&#xff0c;不能替你解析。所以只能用 php://input 取得&#xff0c;并用 parse_str 自行解析而形如 a1&a…

springbean的生命周期_spring bean生命周期(涵盖spring常用接口的载入)

spring bean生命周期流程图&#xff1a;​​​​其中包含了很多常用的接口&#xff0c;可以参考spring 常用接口&#xff1b;下面写个例子证明下&#xff1a;1.实现InitializingBean以及各个Aware接口public class UserB implements InitializingBean , BeanFactoryAware , Bea…

python中的索引从几开始计数_计算机为什么要从 0 开始计数?

作者&#xff1a;程序喵大人来源&#xff1a;程序喵大人大家好&#xff0c;我是猫哥&#xff01;众所周知&#xff0c;计算机是从0开始计数&#xff0c;而不是我们平时常用的从1开始计数&#xff0c;但你有想过为什么吗&#xff1f;其实不是计算机从0开始计数而是多数编程语言中…