早期在Java5以前,我们做多线程程序,一般都用原生的Java的多线程API,比如 new Thread(), start ,wait,notify等 ,如果想实现并行任务,那么一般都是For循环来处理。在java 5以后,Sun公司给我们提供了一个比较好用的框架,那就是ExecutorService。新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特 性。
一、创建一个任务
任务就是一个实现了Runnable接口的类。
创建的时候实run方法即可。
二、执行任务
通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类java.util.concurrent.Executors的静态方法来创建。
Executors此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任 务。
executorService.execute(new TestRunnable());创建ExecutorService
ExecutorService executorService = Executors.newCachedThreadPool(); ExecutorService executorService = Executors.newFixedThreadPool(100); ExecutorService executorService = Executors.newSingleThreadExecutor();
当将一个任务添加到线程池中的时候,线程池会为每个任务创建一个线程,该线程会在之后的某个时刻自动执行。
几个简单的例子
public void test1() throws Exception { //单例线程,任意时间(同一时间)池中只能有一个线程 ExecutorService es = Executors.newSingleThreadExecutor(); es.execute(new Runnable() { @Override public void run() { System.err.println("线程启动并运行"+Thread.currentThread().getName()); } }); es.execute(new Runnable() { @Override public void run() { System.err.println("第二个也运行了"+Thread.currentThread().getName()); } }); }
两个都会执行,但程序只会使用一个线程来运行
public void test2() throws Exception { //声明一个线程池 ExecutorService ex = Executors.newCachedThreadPool(); for (int i = 0; i < 4; i++) { final int a = i; //每一次execute方法,都是向池中放入一个对象 ex.execute(new Runnable() { public void run() { while(true){ System.err.println("测试...."+a+">" +Thread.currentThread().getName()+"," +Thread.currentThread().isDaemon()); try{ Thread.sleep(2000); }catch(Exception e){ e.printStackTrace(); } } } }); } }
一共创建了四个线程,每次每个线程都会执行输出,但不按顺序
public void testCall() throws Exception{ //声明一个类,可以被调用,类似于线程,但它可以拥有返回值 class MyCall implements Callable<String>{ private int seq; 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("完成...."); }
第三个例子主要实现了Callable接口,通过实现这个接口,可以实现线程在执行任务之后有返回值,也可以在这个地方,实现比如多个任务同时执行完成后在进行下一轮,或者其中一个任务执行失败后其他任务停止执行的功能
for(Future<String> f:result){ System.err.println("返回值:"+f.get());//输出返回的值 }
相关推荐
主要为大家详细介绍了java ExecutorService使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了Java ExecutorService四种线程池使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://x125858805.iteye.com/blog/2191873
主要介绍了Java 线程池ExecutorService详解及实例代码的相关资料,线程池减少在创建和销毁线程上所花的时间以及系统资源的开销.如果不使用线程池,有可能造成系统创建大量线程而导致消耗系统内存以及”过度切换
这是利用java的udp通信,利用多线程保持通信持续的java聊天小程序
今天小编就为大家分享一篇关于在spring boot中使用java线程池ExecutorService的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
主要介绍了Java使用ExecutorService来停止线程服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了java中Executor,ExecutorService,ThreadPoolExecutor详解的相关资料,需要的朋友可以参考下
ExecutorService方法案例文件.zip
主要介绍了Java利用ExecutorService实现同步执行大量线程,ExecutorService可以维护我们的大量线程在操作临界资源时的稳定性。
接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行。壹個 ExecutorService 实例因此特别像壹個线程池。事实上,在 java.util.concurrent 包中的 ExecutorService 的实现...
使用 ExecutorService 多线程处理某个进程的简单示例。
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc
NULL 博文链接:https://trylovecatch.iteye.com/blog/1161727
16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ReadWriteLock 22. 原子性布尔 ...
主要介绍了线程并发ScheduledExecutorService类,设置 ScheduledExecutorService ,2秒后,在 1 分钟内每 10 秒钟蜂鸣一次
主要介绍了java 中Executor, ExecutorService 和 Executors 间的不同的相关资料,需要的朋友可以参考下
主要帮助大家理解java多线程中ExcetorServiced的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Executors: 是java.util.concurrent包下的一个类,提供了若干个静态方法,用于生成不同类型的线程池。Executors一共可以创建下面这四类线程池: 1.newFixedThreadPool创建一个可缓存线程池,如果线程池长度超过...