java 22 - 21 多线程之多线程的代码实现方式3
JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
A、public static ExecutorService newCachedThreadPool()
B、public static ExecutorService newFixedThreadPool(int nThreads)
C、public static ExecutorService newSingleThreadExecutor()
这些方法的返回值是ExecutorService对象
该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。
上一次实现的是执行Runnable对象的,这次实现下Callable对象的
注意:Callable:是带泛型的接口。这里指定的泛型其实是call()方法的返回值类型。
例子:多线程同时对不同的数段进行求和
首先创建一个类来继承Callable接口
public class MyCallable implements Callable<Integer> {
// 由于这里需要2个数,开始和结束的数值。
// 所以创建对象,并且写构造方法接收数值
private int start;
private int end;
public MyCallable(int start, int end) {
this.start = start;
this.end = end;
}
int sum = 0;
public Integer call() throws Exception {
for (int x = start; x <= end; x++) {
sum += x;
}
return sum;
}
}
再创建测试类:
public class CallableDemo {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
// 创建线程池对象
ExecutorService pool = Executors.newFixedThreadPool(3);
// 调用方法
// Future<?> submit(Runnable task)
// <T> Future<T> submit(Callable<T> task)
// 这里需要使用泛型来接收结果,由于Callable中的泛型就是返回类型,所以是用Future<T>
Future<Integer> f1 = pool.submit(new MyCallable(1, 100));
Future<Integer> f2 = pool.submit(new MyCallable(100, 200));
Future<Integer> f3 = pool.submit(new MyCallable(1, 200));
// 由于Mycallable类返回了计算的结果,所以这里需要一个方法来接收这个结果
// V get(); 这里需要抛异常
Integer n1 = f1.get();
Integer n2 = f2.get();
Integer n3 = f3.get();
System.out.println(n1);
System.out.println(n2);
System.out.println(n3);
//关闭线程
pool.shutdown();
}
}
这种方式的好处是:
A、可以有返回值
B、可以抛出异常
弊端是:
A、代码比较复杂,所以一般不用
java 22 - 21 多线程之多线程的代码实现方式3的更多相关文章
- java 22 - 10 多线程之两种代码实现方式的比较与区别
- Java 10 的 10 个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- Java 10的10个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- java 多线程: Thread 并发访问-代码块同步synchronized {};String作为被锁的对象
方法同步的弊端 方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是还有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并 ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- Java入门——(4)多线程
关键词:线程.Thread.Runnable.sleep().yield().join().同步 一.线程的概述 在一个操作系统中,每个独立执行的程序都可以称为一个进程,也就是"正在 ...
- Java基础(七)——多线程
一.概述 1.介绍 Java VM 启动的时候会有一个进程Java.exe,该进程中至少有一个线程负责Java程序的执行.而且这个线程运行的代码存在于main方法中,该线程称之为主线程.其实从细节上来 ...
- Java基础系列3:多线程超详细总结
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.线程概述 几乎所 ...
随机推荐
- SharePoint 2013 JavaScript API 记录
1.获取创建者字段(Author),oListItem为SPListItem对象 oListItem.get_item('Author')只能获取到对象,获取用户名要用oListItem.get_it ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- [翻译] GONMarkupParser
GONMarkupParser https://github.com/nicolasgoutaland/GONMarkupParser NSString *inputText = @"Sim ...
- markdown 使用
一:markdown编辑器下载 小书匠 http://soft.xiaoshujiang.com/ 在线编辑工具,所写即所见 作业部落 https://www.zybuluo.com/mdeditor ...
- 【Gson】2.2.4 StackOverflowError 异常
正文 错误: 08-09 09:56:51.904: E/AndroidRuntime(16384): java.lang.StackOverflowError 08-09 09:56:51.904: ...
- 使用Android Annotations开发
使用Android Annotations框架gradle配置1.修改Module下的build.gradle apply plugin: 'com.android.application' appl ...
- C++ virtual虚函数
#include<iostream> using namespace std; class Base{ public: void m() { cout << "it' ...
- 如何退出调起多个Activity的Application?
1.记录打开的Activity 每打开一个activity,即记录下来,需要关闭时,关闭每一个activity即可. 2.发送特定的广播 在需要结束应用时,发送一个特定广播,每个activity收到此 ...
- yii2解决百度编辑器umeditor图片上传问题
作者:白狼 出处:http://www.manks.top/article/yii2_umeditor_upload本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 ...
- jstree动态生成树
前篇文章简单介绍了静态生成树,这篇文章将通过后台把数据通过json形式传到前台,进行动态生成树. 本篇的程序所用框架为Spring MVC,可以很方便的通过controller层传json到前台. 前 ...