首页 > 编程知识 正文

cron定时任务表达式,windows控制台运行程序

时间:2023-05-03 07:14:03 阅读:148131 作者:3869

线程池thread pool,减少并发线程数

调用Executors类的静态方法newCachedThreadPool或newFixedThreadPool

通过调用submit提交Runnable或Callable对象。 请保存返回的Future对象

3 .如果不再提交任务,请调用shutdown或shutdownNow

shutdown方法开始线程池的关闭序列,关闭的执行器不接受新任务,所有任务完成后,线程池中的线程将死亡。

shutdownNow方法取消所有未打开的任务,并尝试中断正在运行的线程

executorserviceexector=executors.newcachedthreadpool (; callable _1callable1=new callable _1(; futureintegerresult=exector.submit (callable 1; exector.shutdown (; executorserviceexector=executors.newcachedthreadpool (; callable _1callable1=new callable _1(; futuretaskintegerresult=newfuturetask (计算1; exector.submit(result; exector.shutdown (; 控制任务组

invokeAny方法将所有对象提交到一个Callable对象的集合中,并返回已完成任务的结果,但无法确定是该任务的结果。 适合搜索问题的回答方案。 其中一个任务得到答案后,可以停止计算。

invokeAll方法将所有对象提交到Callable对象的集合中,并返回表示所有任务解决方案的Future对象的集合。 当集合返回时,所有任务都将完成,Future对象的顺序不会改变。 但是,这可能需要一些时间,后者的任务在前者的任务完成之前不会开始。

ExecutorCompletionService完成服务类并将Callable对象发送到完成服务。 此服务管理Future对象的阻塞队列。 某项任务完成时,如果有结果就会返回。 虽然不需要等到所有任务都完成,但是返回的结果是有顺序的

eg1 :调用invoke any方法

package com.lmr.thread; import java.util.ArrayList; import java.util.List; import java.util.Random; import Java.util.concurrent.callable; import Java.util.concurrent.execution exception; import Java.util.concurrent.executorcompletionservice; import Java.util.concurrent.executorservice; import Java.util.concurrent.executors; import Java.util.concurrent.future; import Java.util.concurrent.future task; import Java.util.concurrent.semaphore; publicclasscontroltaskgrouptest { publicstaticvoidmain [ ] args } { listcallableintegercallablelist=new ArrayList } listfututurest Random rand=new Random (; for(intI=1; i10; I ) callableintegercallable=newsumcallable (I,i 10,) rand.nextint ) 10 )1) *100 ); callablelist.add(callable ),用于随机生成线程休息时数,以便于了解线程的执行进度; } executorserviceexecutor=executors.newcachedthreadpool (; try { system.out.println (executor.invoke any ) callablelist ); 返回callablelist中任何已完成任务的结果}catch(interruptedexceptione )//todo auto-generatedcatchblocke.print stack trace ); }catch(executionexceptione )

// TODO Auto-generated catch block e.printStackTrace(); } }class SumCallable implements Callable<Integer>{ private int start; private int end; private int sleeptime;//线程休息时间 private int result; public SumCallable(int start,int end,int sleeptime) { // TODO Auto-generated constructor stub this.start=start; this.end=end; this.sleeptime=sleeptime; } @Override public Integer call() throws Exception { // TODO Auto-generated method stub result=0; for(int i=start;i<=end;i++){ result+=i; Thread.sleep(sleeptime); } System.out.println("start: "+start+" end: "+end+" sleeptime: "+sleeptime+" result: "+result); return result; }}

结果:返回最先执行完成的任务的结果

result1:start: 4 end: 14 sleeptime: 100 result: 9999result2:start: 4 end: 14 sleeptime: 200 result: 99start: 6 end: 16 sleeptime: 200 result: 12199

eg2:调用invokeAll方法

public class ControlTaskGroupTest { public static void main(String[] args) { List<Callable<Integer>> callablelist=new ArrayList<>(); List<Future<Integer>> tasklist=new ArrayList<>(); Random rand=new Random(); for(int i=1;i<10;i++){ Callable<Integer> callable=new SumCallable(i, i+10, (rand.nextInt(10)+1)*100);//随机生成线程休息时间数,便于识别线程执行的进度 callablelist.add(callable); } ExecutorService executor=Executors.newCachedThreadPool(); try { tasklist=executor.invokeAll(callablelist);//返回一个Future对象的列表,代表所有任务的解决方案,当返回时,所有任务已全部完成,且结果是有序的(但比较耗时,须等待所有任务全部完成) } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(Future<Integer> task:tasklist){ try { System.out.println(" ---------------- "+task.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}

结果:必须等所有任务执行完成,才会获得结果。虽然线程的执行速度不同,但结果是有序的。

start: 2 end: 12 sleeptime: 400 result: 77start: 8 end: 18 sleeptime: 500 result: 143start: 5 end: 15 sleeptime: 600 result: 110start: 9 end: 19 sleeptime: 700 result: 154start: 3 end: 13 sleeptime: 800 result: 88start: 6 end: 16 sleeptime: 800 result: 121start: 7 end: 17 sleeptime: 800 result: 132start: 1 end: 11 sleeptime: 900 result: 66start: 4 end: 14 sleeptime: 1000 result: 99 ---------------- 66 ---------------- 77 ---------------- 88 ---------------- 99 ---------------- 110 ---------------- 121 ---------------- 132 ---------------- 143 ---------------- 154

eg3:调用完成服务类

public class ControlTaskGroupTest { public static void main(String[] args) { List<Callable<Integer>> callablelist=new ArrayList<>(); Random rand=new Random(); for(int i=1;i<10;i++){ Callable<Integer> callable=new SumCallable(i, i+10, (rand.nextInt(10)+1)*100);//随机生成线程休息时间数,便于识别线程执行的进度 callablelist.add(callable); } ExecutorService executor=Executors.newCachedThreadPool(); @SuppressWarnings("rawtypes") ExecutorCompletionService service=new ExecutorCompletionService(executor);//完成服务执行器,提交任务 for(Callable<Integer> callable:callablelist){ service.submit(callable); } for(int i=0;i<callablelist.size();i++){ try { System.out.println(service.take().get());//当任务完成时,有结果就返回,无须等待全部任务完成,但结果没顺序 //take()取出下一个已完成的结果,若无结果可用则阻塞 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}

结果:任务已完成就会返回结果打印

start: 9 end: 19 sleeptime: 200 result: 154154start: 8 end: 18 sleeptime: 300 result: 143start: 5 end: 15 sleeptime: 300 result: 110143110start: 3 end: 13 sleeptime: 400 result: 8888start: 7 end: 17 sleeptime: 700 result: 132start: 6 end: 16 sleeptime: 700 result: 121132121start: 2 end: 12 sleeptime: 900 result: 7777start: 4 end: 14 sleeptime: 1000 result: 99start: 1 end: 11 sleeptime: 1000 result: 669966

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。