转:线程池ExecutorService的submit和execute
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过 Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特 性。
一、创建任务
任务就是一个实现了Runnable接口的类。
创建的时候实run方法即可。
二、执行任务
通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类java.util.concurrent.Executors的静态方法来创建。
Executors此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任 务。
executorService.execute(new TestRunnable());
1、创建ExecutorService
通过工具类java.util.concurrent.Executors的静态方法来创建。
Executors此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
比如,创建一个ExecutorService的实例,ExecutorService实际上是一个线程池的管理工具:
ExecutorService executorService = Executors.newCachedThreadPool();
ExecutorService executorService = Executors.newFixedThreadPool(3);
ExecutorService executorService = Executors.newSingleThreadExecutor();
2、将任务添加到线程去执行
当将一个任务添加到线程池中的时候,线程池会为每个任务创建一个线程,该线程会在之后的某个时刻自动执行。
示例1:
@Test
publicvoid testDemo() throws Exception {
//单例线程,任意时间(同一时间)池中只能有一个线程
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(new Runnable() {
@Override
publicvoid run() {
System.err.println("线程启动并运行"+Thread.currentThread().getName());
}
});
es.execute(new Runnable() {
@Override
publicvoid run() {
System.err.println("第二个也运行了"+Thread.currentThread().getName());
}
});
//Thread.sleep(1000 * 60 * 60);
}
运行结果如下:两个都会执行,但程序只会使用一个线程来运行。
线程启动并运行pool-1-thread-1
第二个也运行了pool-1-thread-1
示例2:
@Test
publicvoid testDemo3() throws Exception {
//声明一个线程池
ExecutorService ex = Executors.newCachedThreadPool();
for (int i = 0; i < 4; i++) {
finalint a = i;
//每一次execute方法,都是向池中放入一个对象
ex.execute(new Runnable() {
publicvoid run() {
while(true){
System.err.println("测试...."+a+">"
+Thread.currentThread().getName()+","
+Thread.currentThread().isDaemon());
try{
Thread.sleep(2000);
}catch(Exception e){
e.printStackTrace();
}
}
}
});
}
Thread.sleep(1000*60*60);
}
输出的结果如下:从中可以发现,第四个一组输出,即一共创建了四个线程,每次每个线程都会执行输出,但不按顺序:位每一次输出都四个算是一组
测试....0>pool-1-thread-1,false
测试....3>pool-1-thread-4,false
测试....2>pool-1-thread-3,false
测试....1>pool-1-thread-2,false
测试....0>pool-1-thread-1,false
测试....3>pool-1-thread-4,false
测试....2>pool-1-thread-3,false
测试....1>pool-1-thread-2,false
测试....1>pool-1-thread-2,false
测试....2>pool-1-thread-3,false
测试....3>pool-1-thread-4,false
测试....0>pool-1-thread-1,false
示例3:
publicvoid testCall() throws Exception{
//声明一个类,可以被调用,类似于线程,但它可以拥有返回值
class MyCall implements Callable<String>{
privateintseq;
public MyCall(int seq){
this.seq=seq;
}
//抛出异常并可以拥有返回值
public String call() throws Exception {
System.err.println("执行"+seq+","+Thread.currentThread().getName());
Thread.sleep(3000);
System.err.println("Weak up "+seq);
return"完成"+seq;//这是返回值
}
}
ExecutorService es = Executors.newCachedThreadPool();//创建线程池对象
List<Future<String>> result =new ArrayList<Future<String>>();//放结果用的集合
for(int i=0;i<3;i++){
Future<String> f=es.submit(new MyCall(i));//线程执行完成以后可以通过引用获取返回值
result.add(f);
}
for(Future<String> f:result){
System.err.println("返回值:"+f.get());//输出返回的值
}
System.err.println("完成....");
}
相关推荐
今天小编就为大家分享一篇关于在spring boot中使用java线程池ExecutorService的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
ExecutorService的execute和submit方法
主要介绍了Java 线程池ExecutorService详解及实例代码的相关资料,线程池减少在创建和销毁线程上所花的时间以及系统资源的开销.如果不使用线程池,有可能造成系统创建大量线程而导致消耗系统内存以及”过度切换
这段代码实现了一个简单的线程池ExecutorService,其中使用了Java的匿名内部类。在类的构造方法中,首先创建了一个固定大小为5的线程池。然后通过循环提交了10个任务到线程池中执行。每个任务都是一个匿名内部类实现...
本程序实现了ExecutorService线程池,内置说明txt说明,可以参考
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
按先后顺序执行线程 ... ExecutorService t = Executors.newSingleThreadExecutor(); for (int i = 0; i ; i++) { t.submit(new AA(i)); } System.out.println("kkkkkkkkkk"); t.shutdown(); }
创建线程池ExecutorService和资源 * 7.创建MyBaseadapter带参构造函数(Context context) * 8.创建ViewHolder对象用于存储那些Item内部的View的直接引用 * 9.getView()中判断convertView是否为空,防止过多填充...
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc
NULL 博文链接:https://x125858805.iteye.com/blog/2191873
该组件中,Executor 和 ExecutorService 接口 定义了线程池最核心的几个方法,提交任务 submit ()、关闭线程池 shutdown()。抽象类 AbstractExecutorService 主要对公共行为 submit()系列方法进行了实现,这些 ...
ThreadPoolExecutor还有两个常用的方法shutdown和submit,两者都用来关闭线程池, 但是submit有一个结果返回. 线程池任务执行 当执行executor(Runnable command)方法后, 传入一个任务, public void execute...
接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且...壹個 ExecutorService 实例因此特别像壹個线程池。事实上,在 java.util.concurrent 包中的 ExecutorService 的实现就是壹個线程池的实现。
executorService.execute(new Handler(socket)); }catch (IOException e) { e.printStackTrace(); } } } public static void main(String args[])throws IOException { new EchoServer()....
线程的创建和销毁比较消耗资源,所以有一种更加高效快捷的方式管理线程—-线程池。 先来看一下线程池的java模型 Executor:线程池顶级接口,只有一个方法 ExecutorService:真正的线程池接口 void execute(Runnable...
ExecutorService方法案例文件.zip
主要介绍了Java ExecutorService四种线程池使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...
Executors: 是java.util.concurrent包下的一个类,提供了若干个静态方法,用于生成不同类型的线程池。Executors一共可以创建下面这四类线程池: 1.newFixedThreadPool创建一个可缓存线程池,如果线程池长度超过...
3)使用了线程池ExecutorService mThreadPool技术 4)使用了Semaphore 信号来控制变量按照先后顺序执行,避免空指针的问题 如何使用: 在Adapter里加载图片时 代码如下:ImageLoader.getInstance.loadImage(...