首页 > 其他分享 >【JUC】4-FutrueTask结合线程池的应用

【JUC】4-FutrueTask结合线程池的应用

时间:2024-06-05 21:35:12浏览次数:26  
标签:JUC get System FutrueTask println 线程 FutureTask executorService out

1、通过线程池提交FutrueTask异步任务

 1 public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
 2 
 3         long start = System.currentTimeMillis();
 4         ExecutorService executorService = Executors.newFixedThreadPool(3);
 5 
 6         FutureTask<String> futureTask1 = new FutureTask<>(() -> {
 7             TimeUnit.SECONDS.sleep(3);
 8             return "futureTask1";
 9         });
10 
11         executorService.submit(futureTask1);
12 
13         FutureTask<String> futureTask2 = new FutureTask<>(() -> {
14             TimeUnit.SECONDS.sleep(10);
15             return "futureTask2";
16         });
17         executorService.submit(futureTask2);
18         FutureTask<String> futureTask3 = new FutureTask<>(() -> {
19             TimeUnit.SECONDS.sleep(4);
20             return "futureTask3";
21         });
22         executorService.submit(futureTask3);
23 
24         // 获取结果才是等待线程执行完成,如果不获取结果只是提交了任务
25         System.out.println(futureTask1.get());
26         System.out.println(futureTask2.get());
27         System.out.println(futureTask3.get());
28         // FutrueTask接口一旦调用了get()方法,就会一直等待计算结果,容易造成线程阻塞
29         // get()方法一般放在程序后面
30         // 或者指定等待时间
31         System.out.println(futureTask2.get(3, TimeUnit.SECONDS)); // 会抛出异常
32 
33         executorService.shutdown();
34 
35         long end = System.currentTimeMillis();
36 
37         System.out.println(end - start);
38     }

2、轮询获取FutrueTask的处理结果

要想FutrueTask的任务尽量不阻塞其他线程任务,应该把get()放到后面,并且采用轮询的方法获取计算结果

 1 public static void main(String[] args) {
 2         ExecutorService executorService = Executors.newFixedThreadPool(3);
 3         try {
 4             FutureTask<String> futureTask = new FutureTask<>(() -> {
 5                 TimeUnit.SECONDS.sleep(5);
 6                 return "futureTask";
 7             });
 8 
 9             executorService.submit(futureTask);
10 
11             System.out.println("执行其他任务...");
12 
13             // 轮询耗费资源
14             while (true) {
15                 if (futureTask.isDone()) {
16                     System.out.println(futureTask.get());
17                     break;
18                 } else {
19                     TimeUnit.MILLISECONDS.sleep(500);
20                     System.out.println("程序处理中,勿催");
21                 }
22             }
23 
24         } catch (Exception e) {
25             e.printStackTrace();
26         } finally {
27             executorService.shutdown();
28         }
29     }

 

标签:JUC,get,System,FutrueTask,println,线程,FutureTask,executorService,out
From: https://www.cnblogs.com/zhaohan258/p/18233849

相关文章

  • 【JUC】1-Java线程的启动
    以Thread创建线程为例:1Threadthread=newThread(){2@Override3publicvoidrun(){4log.info("createandstartathreadthroughcreatingaThreadObject");5}6};7thread.start();......
  • Java:实现使用CountDownLatch实现线程同步(附完整源码)
    Java:实现使用CountDownLatch实现线程同步我可以帮你实现使用CountDownLatch实现线程同步的Java代码。以下是一个简单的示例:​importjava.util.concurrent.CountDownLatch;​publicclassThreadSyncExample{publicstaticvoidmain(String[]args)t......
  • Java线程池分类简单列举
    一、Java四种线程池Java通过Executors提供四种线程池,分别为newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出......
  • 线程池的拒绝策略(Java)
    java线程池的拒绝策略Java中的线程池拒绝策略定义了当任务无法执行时如何处理这些任务。以下是Java中常见的拒绝策略:一、CallerRunsPolicy#:当任务被拒绝添加时,如果调用者所在的线程不是线程池中的线程,那么任务将由该调用者所在的线程直接执行。ExecutorServiceexecutor......
  • 【Go-多线程】Golang的channel实现消息的批量处理
    【Go-多线程】Golang的channel实现消息的批量处理。当消息量特别大时,使用kafka之类的messagequeue是首选,但这是更加轻量的方案channelx.go//这个方案需要实现以下几点://1.消息聚合后处理(最大条数为BatchSize),核心://(1)带buffer的channel相当于一个FIFO的队列//(2)多个常驻的gorou......
  • 多线程实现爬取图片
    importosimportthreadingimportrequestsfromget_img_urlimportget_img_url#下载单张图片方法,方法入参为图片url地址和图片名称defdownload_image(url,filename):response=requests.get(url)withopen(filename,'wb')asf:f.write(respon......
  • c++ 运算符重载、线程安全实现单例
    一、运算符重载namespaceCalcRect{ structRect { Rect(intposX=0,intposY=0,intw=0,inth=0) { x=posX; y=posY; width=w; height=h; } voidoperator=(constRect&other) { x=other.x; y=other.y; width=ot......
  • (三)Redis 线程与IO模型
    1、Redis单线程通常说Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,其他功能,比如持久化、异步删除、集群数据同步等,是由额外的线程执行的,所以严格来说,Redis并不是单线程。多线程开发会不可避免的带来并发控制和资源开销的问题,如果没有良好的系统......
  • 线程与进程的实现
    目录1.线程的实现方式1.用户级线程(User-LevelThreads,ULTs)2.内核级线程(Kernel-LevelThreads,KLTs)2.线程的具体实现2.1用户级线程的实现2.2内核级线程的实现3.线程的创建与终止4.进程的创建与终止5.进程同步与互斥6.进程通信总结1.线程的实现方式 ......
  • IO进程线程(五)库的制作、进程
    文章目录一、库(一)静态库1.概念2.制作3.使用(编译)(1)生成可执行文件(2)运行(二)动态库(共享库)1.概念2.制作3.生成可执行文件4.基于动态库的可执行文件的执行过程二、进程(一)概念1.进程2.进程和程序的区别3.进程的组成4.进程的种类(1)交互进程(2)批处理进程(3)守护进程5.......