急!!!在线等-----java多线程的操作

花含 2014-06-16 09:48:18

public static final ExecutorService threadPool = Executors.newFixedThreadPool(10);



用上面这种jdk自带的方法创建了10个线程并发去执行任务,现在出现一个问题,假如我9点有12个任务要执行,9:30有12个任务要执行,测试结果可能是9:30的任务已经执行完了,而9点的任务还有的没有执行,请问怎么设定线程的执行顺序呢,比如,我想让9点的全部执行完以后再执行9:30的,类似于先进先出的这种模式。

大牛帮忙呀!多线程这一块不太熟。
...全文
186 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
花含 2014-06-16
  • 打赏
  • 举报
回复
引用 2 楼 ygycomon 的回复:
搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。[/quote] 那用ExecutorService的submit方法呀,没submit一个任务,会返回一个Future,你15个任务都提交完了就会返回15个Future,放到一个list中遍历,你可以通过Future的get方法取得每个任务返回的结果,也可以通过isDone方法判断有没有执行完, 当这15个Future的isDone方法都返回true,你的任务也就执行完了![/quote] 这是个好方法,但是quartz本身也是多线程调度,两个批次同一时间点并发的时候,这个集合不好存吧? 其实我主要是想实现的是:先运行触发时间早的小批次任务,只要上一批次中的小任务没有未执行的,就可以开始下一个批次的任务处理,甭管上一个批次的小任务是否执行完成,这样的话效率是最高的。[/quote] 你是用无界队列的线程池吧!所有任务都能加进去的![/quote] 对的,现在想用一个带策略的队列。FIFO这种策略的,我是不是要换类, 用ThreadPoolExecutor这个类?[/quote] 你可以通过ThreadPoolExecutor的构造方法指定队列的策略ArrayBlockingQueue和LinkedBlockingQueue就是FIFO策略的![/quote] 欧了!多谢,我试试。
S117 2014-06-16
  • 打赏
  • 举报
回复
引用 11 楼 lijibo503 的回复:
[quote=引用 10 楼 longtian1213 的回复:] [quote=引用 9 楼 lijibo503 的回复:] [quote=引用 8 楼 longtian1213 的回复:] [quote=引用 7 楼 lijibo503 的回复:] [quote=引用 6 楼 longtian1213 的回复:] [quote=引用 4 楼 lijibo503 的回复:] [quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。[/quote] 那用ExecutorService的submit方法呀,没submit一个任务,会返回一个Future,你15个任务都提交完了就会返回15个Future,放到一个list中遍历,你可以通过Future的get方法取得每个任务返回的结果,也可以通过isDone方法判断有没有执行完, 当这15个Future的isDone方法都返回true,你的任务也就执行完了![/quote] 这是个好方法,但是quartz本身也是多线程调度,两个批次同一时间点并发的时候,这个集合不好存吧? 其实我主要是想实现的是:先运行触发时间早的小批次任务,只要上一批次中的小任务没有未执行的,就可以开始下一个批次的任务处理,甭管上一个批次的小任务是否执行完成,这样的话效率是最高的。[/quote] 你是用无界队列的线程池吧!所有任务都能加进去的![/quote] 对的,现在想用一个带策略的队列。FIFO这种策略的,我是不是要换类, 用ThreadPoolExecutor这个类?[/quote] 你可以通过ThreadPoolExecutor的构造方法指定队列的策略ArrayBlockingQueue和LinkedBlockingQueue就是FIFO策略的!
花含 2014-06-16
  • 打赏
  • 举报
回复
引用 10 楼 longtian1213 的回复:
[quote=引用 9 楼 lijibo503 的回复:] [quote=引用 8 楼 longtian1213 的回复:] [quote=引用 7 楼 lijibo503 的回复:] [quote=引用 6 楼 longtian1213 的回复:] [quote=引用 4 楼 lijibo503 的回复:] [quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。[/quote] 那用ExecutorService的submit方法呀,没submit一个任务,会返回一个Future,你15个任务都提交完了就会返回15个Future,放到一个list中遍历,你可以通过Future的get方法取得每个任务返回的结果,也可以通过isDone方法判断有没有执行完, 当这15个Future的isDone方法都返回true,你的任务也就执行完了![/quote] 这是个好方法,但是quartz本身也是多线程调度,两个批次同一时间点并发的时候,这个集合不好存吧? 其实我主要是想实现的是:先运行触发时间早的小批次任务,只要上一批次中的小任务没有未执行的,就可以开始下一个批次的任务处理,甭管上一个批次的小任务是否执行完成,这样的话效率是最高的。[/quote] 你是用无界队列的线程池吧!所有任务都能加进去的![/quote] 对的,现在想用一个带策略的队列。FIFO这种策略的,我是不是要换类, 用ThreadPoolExecutor这个类?
S117 2014-06-16
  • 打赏
  • 举报
回复
引用 9 楼 lijibo503 的回复:
[quote=引用 8 楼 longtian1213 的回复:] [quote=引用 7 楼 lijibo503 的回复:] [quote=引用 6 楼 longtian1213 的回复:] [quote=引用 4 楼 lijibo503 的回复:] [quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。[/quote] 那用ExecutorService的submit方法呀,没submit一个任务,会返回一个Future,你15个任务都提交完了就会返回15个Future,放到一个list中遍历,你可以通过Future的get方法取得每个任务返回的结果,也可以通过isDone方法判断有没有执行完, 当这15个Future的isDone方法都返回true,你的任务也就执行完了![/quote] 这是个好方法,但是quartz本身也是多线程调度,两个批次同一时间点并发的时候,这个集合不好存吧? 其实我主要是想实现的是:先运行触发时间早的小批次任务,只要上一批次中的小任务没有未执行的,就可以开始下一个批次的任务处理,甭管上一个批次的小任务是否执行完成,这样的话效率是最高的。[/quote] 你是用无界队列的线程池吧!所有任务都能加进去的!
花含 2014-06-16
  • 打赏
  • 举报
回复
引用 8 楼 longtian1213 的回复:
[quote=引用 7 楼 lijibo503 的回复:] [quote=引用 6 楼 longtian1213 的回复:] [quote=引用 4 楼 lijibo503 的回复:] [quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。[/quote] 那用ExecutorService的submit方法呀,没submit一个任务,会返回一个Future,你15个任务都提交完了就会返回15个Future,放到一个list中遍历,你可以通过Future的get方法取得每个任务返回的结果,也可以通过isDone方法判断有没有执行完, 当这15个Future的isDone方法都返回true,你的任务也就执行完了![/quote] 这是个好方法,但是quartz本身也是多线程调度,两个批次同一时间点并发的时候,这个集合不好存吧? 其实我主要是想实现的是:先运行触发时间早的小批次任务,只要上一批次中的小任务没有未执行的,就可以开始下一个批次的任务处理,甭管上一个批次的小任务是否执行完成,这样的话效率是最高的。
S117 2014-06-16
  • 打赏
  • 举报
回复
引用 7 楼 lijibo503 的回复:
[quote=引用 6 楼 longtian1213 的回复:] [quote=引用 4 楼 lijibo503 的回复:] [quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。[/quote] 那用ExecutorService的submit方法呀,没submit一个任务,会返回一个Future,你15个任务都提交完了就会返回15个Future,放到一个list中遍历,你可以通过Future的get方法取得每个任务返回的结果,也可以通过isDone方法判断有没有执行完, 当这15个Future的isDone方法都返回true,你的任务也就执行完了!
花含 2014-06-16
  • 打赏
  • 举报
回复
引用 6 楼 longtian1213 的回复:
[quote=引用 4 楼 lijibo503 的回复:] [quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架![/quote] 嘿嘿,我这刚好用的就是quartz,我是用quartz调度了一个批次,然后这个批次是一个大的调度任务,这个批次又包涵了很多小任务,所以我又开了一个线程池(10个线程)同时执行小任务,不知道我说明白了没。这个批次半个小时调度一次,就出现了我上面说的情况。
S117 2014-06-16
  • 打赏
  • 举报
回复
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote]
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 不要用线程池,用quartz,开源的定时任务调度框架!
致知Fighting 2014-06-16
  • 打赏
  • 举报
回复
引用 4 楼 lijibo503 的回复:
[quote=引用 2 楼 ygycomon 的回复:] 搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?[/quote] 放个静态变量记录完成数量行不行? 实在不行你就不要9:30开始下一波,晚一点也可以啊,这不是给自己出难题么
花含 2014-06-16
  • 打赏
  • 举报
回复
引用 2 楼 ygycomon 的回复:
搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
假如我9点运行15个任务,有10个线程去处理这15个任务,一次处理不完,还有5个等待处理,怎么标识这15个任务啥时候完成?
花含 2014-06-16
  • 打赏
  • 举报
回复
引用 1 楼 longtian1213 的回复:
怎么可能9:30的都执行完了,9:00的还没执行呢,你怎么设置的时间呀!
引用 1 楼 longtian1213 的回复:
怎么可能9:30的都执行完了,9:00的还没执行呢,你怎么设置的时间呀!
引用 1 楼 longtian1213 的回复:
怎么可能9:30的都执行完了,9:00的还没执行呢,你怎么设置的时间呀!
我把任务放进线程池了,然后看数据库的执行状态,发现9:30的都执行了,9点的还没执行呢,好像线程池有一个FIFO策略,不知道怎么使用的。附上往线程池添加任务的代码


			for(int i=0;i<list.size();i++){	
				final String ertRunId = erl_runId;   //该批次的运行号
			    final SaveCheckPoint sPoint= list.get(i);  
			    final int task = i+1;
				threadPool.execute(new Runnable() {
					@Override
					public void run() {
							 handleCheckPointProcess(sPoint, task,ertRunId);
							//  new inner().handleCheckPointProcess(sPoint, task, ertRunId);
					}
				});
			}
致知Fighting 2014-06-16
  • 打赏
  • 举报
回复
搞个静态变量记录你系统的运行状态,9点的任务跑完了把状态设置为可行,才允许后面的任务开始,不然就阻塞
S117 2014-06-16
  • 打赏
  • 举报
回复
怎么可能9:30的都执行完了,9:00的还没执行呢,你怎么设置的时间呀!

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧