如题,假设有线程:A、B、C,每条线程执行不同的任务,循环100次执行,怎么能让A线程,每次循环的时候,都是A线程先执行呢?
各位大哥大姐,有小例子给我看看么? 求教。谢谢。
抱歉,各位大哥大姐,我修正一下题意:
模拟场景如下:
甲方有三张表:A1,A2,A3 存放不同数据,每天都有新数据产生;现在,我需要每天拉取甲方三张表的数据存放到本地数据库中,由于表的关联问题,我需要确保每天:表A1的数据先拉取完毕并入库。就是说,在相同的一段时间内,先拉取完A1的数据,再去拉取A2,A3表的数据。
我的做法如下,开启3条线程:A、B、C。让3条线程隔5秒钟执行一次,每次拉取一定量数据。问题就出来了,我现在想让A线程,每次都先执行。
以下是采用的线程池:
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(3); executor.scheduleWithFixedDelay(A, 0, 5, TimeUnit.SECONDS); executor.scheduleWithFixedDelay(B, 0, 5, TimeUnit.SECONDS); executor.scheduleWithFixedDelay(C, 0, 5, TimeUnit.SECONDS);
问题和方法不对啊。A1,A2,A3过程明明是串行你非要搞成并行。
假设每个操作的只依赖前者的子步骤,那么仍然不是全并行的,那么加个锁或者加个标识后者来等待即可。
谢谢。 那大哥,有简单的例子的? 线程内容打印一条语句什么的,应该就可以节省时间了。
1、既然是多线程,肯定有的快,有的慢,所以A执行3次,可能B已经执行了5次。除非你这循环是在线程外面的。
2、想保证A执行优先,A不要放线程里面
这样写
Run A;
Run Thread B;
Run Thread C;
如果A执行时间太长,你只是想要A先开始,不一定需要等待A结束。
虽然这是NO SENSE,开始没啥屁用的。
那么你可以这样写
Boolean isAStart=False;
Run Thread A;
while(!isAStart)
{
do nothing;
}
Run Thread B;
Run Thread C;
function A(){
isAStart=true;
.....
}
谢谢!! 虽然没怎么懂。 =_=||
@南小鸟: 看了补充说明。
简单的说,A不要放线程,或者等A运行结束再开启B\C线程就行了。
你想太多了。
@爱编程的大叔: 拉取表A1的类不弄成线程是么?,感觉这样子,A只能执行一遍,可我想定时的去拉取表A1的数据。
@南小鸟: 执行几遍和线程一毛钱关系都没有。那叫调度。
尝试设置线程优先级,不能完全保证执行顺序。非要保证,你就先执行你要先执行的代码,之后再多线程。
谢谢。
首先不考虑线程谁先执行。
先想清楚这个问题:
如果没有线程,就是三个普通的方法执行三个不同的任务,它们之间有没有你所强调的先后顺序?
再想一个问题:
你为了什么要用三个线程去执行那三个方法的?
如果是普通方法,肯定也是有先后顺序。至于为什么要用三个线程去执行呢,恩..我修改了一下题意,大哥若有空,可以再看看。谢谢。
多线程本来就是用来并行执行任务的,你又要某个任务先执行,又要多线程,矛盾了,没必要多线程。
如果非要这么做的话,可以用信号量阻塞,当优先级高的执行完,再释放阻塞。
可是,如果不弄成多线程,怎么做到定时拉取数据?大哥没有例子咯?
@南小鸟: 放在一个线程里面跑三个方法不就行了
@hahanonym: 哦,那上一句:可以用信号量阻塞,当优先级高的执行完,再释放阻塞。 这个信号量阻塞,是什么意思。 代码怎么写?
@南小鸟: 信号阻塞只是高级术语,就是我说的isAFinished变量就够了。
@南小鸟: AutoResetEvent 之类的信号量
为什么不这么考虑:将拉取A,B,C的方法放在一个线程里顺序执行?
将所有方法放到一个线程执行,然后定时调用该线程。恩,可以...但,总觉得拉取效率太低。
@南小鸟: 你这个a,b,c本来不就是顺序执行吗?如果b,c可以不顺序,可以a执行完再建线程
@TCG2008: 你的意思是:在一个线程内,1、先调用拉取A1表的方法;2、然后在该线程里面再建立线程,用于拉取A2、A3表的数据。 是这样子么?
你这是在做数据备份?
这倒没有,这是由于需求需要。
主线程 启动A1线程,A1线程执行完启动A2 和A3线程
谢谢,这是我想到的方法,你看看是不是这个:
Runnable A= new Runnable() { public void run() { //线程A的业务处理 for(int j=0;j<3;j++){ System.out.println("线程A "+j); } //线程A内容执行完毕之后,开启线程B、C ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); executor.scheduleWithFixedDelay(线程B, 0, 5, TimeUnit.SECONDS); executor.scheduleWithFixedDelay(线程C, 0, 5, TimeUnit.SECONDS); } };
//开启主线程A: ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); executor.scheduleWithFixedDelay(A, 0, 5, TimeUnit.SECONDS);