首页 新闻 会员 周边 捐助

大神求解:多线程,怎么保证某条线程执行顺序始终排在第一位?

0
[已解决问题] 解决于 2017-06-09 13:54

如题,假设有线程: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);

 

明日小路的主页 明日小路 | 菜鸟二级 | 园豆:466
提问于:2017-06-02 09:18
< >
分享
最佳答案
0

问题和方法不对啊。A1,A2,A3过程明明是串行你非要搞成并行。

假设每个操作的只依赖前者的子步骤,那么仍然不是全并行的,那么加个锁或者加个标识后者来等待即可。

奖励园豆:5
花飘水流兮 | 专家六级 |园豆:13615 | 2017-06-03 01:24

谢谢。   那大哥,有简单的例子的?  线程内容打印一条语句什么的,应该就可以节省时间了。

明日小路 | 园豆:466 (菜鸟二级) | 2017-06-05 09:12
其他回答(7)
0

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;

.....

}

爱编程的大叔 | 园豆:30844 (高人七级) | 2017-06-02 09:26

谢谢!!   虽然没怎么懂。  =_=||

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 09:38

@南小鸟: 看了补充说明。

简单的说,A不要放线程,或者等A运行结束再开启B\C线程就行了。

 

你想太多了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-06-02 11:49

@爱编程的大叔: 拉取表A1的类不弄成线程是么?,感觉这样子,A只能执行一遍,可我想定时的去拉取表A1的数据。

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 11:59

@南小鸟: 执行几遍和线程一毛钱关系都没有。那叫调度。

 

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-06-02 12:02
0

尝试设置线程优先级,不能完全保证执行顺序。非要保证,你就先执行你要先执行的代码,之后再多线程。

幻天芒 | 园豆:37207 (高人七级) | 2017-06-02 09:28

谢谢。

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 09:38
0

首先不考虑线程谁先执行。

先想清楚这个问题:

如果没有线程,就是三个普通的方法执行三个不同的任务,它们之间有没有你所强调的先后顺序?

再想一个问题:

你为了什么要用三个线程去执行那三个方法的?

 

西漠以西 | 园豆:1675 (小虾三级) | 2017-06-02 09:38

如果是普通方法,肯定也是有先后顺序。至于为什么要用三个线程去执行呢,恩..我修改了一下题意,大哥若有空,可以再看看。谢谢。

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 09:56
0

多线程本来就是用来并行执行任务的,你又要某个任务先执行,又要多线程,矛盾了,没必要多线程。

如果非要这么做的话,可以用信号量阻塞,当优先级高的执行完,再释放阻塞。

hahanonym | 园豆:1460 (小虾三级) | 2017-06-02 10:52

可是,如果不弄成多线程,怎么做到定时拉取数据?大哥没有例子咯?

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 10:57

@南小鸟: 放在一个线程里面跑三个方法不就行了

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2017-06-02 11:44

@hahanonym: 哦,那上一句:可以用信号量阻塞,当优先级高的执行完,再释放阻塞。  这个信号量阻塞,是什么意思。 代码怎么写?

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 11:46

@南小鸟: 信号阻塞只是高级术语,就是我说的isAFinished变量就够了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-06-02 11:51

@南小鸟: AutoResetEvent 之类的信号量

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2017-06-02 13:11
0

为什么不这么考虑:将拉取A,B,C的方法放在一个线程里顺序执行?

TCG2008 | 园豆:1150 (小虾三级) | 2017-06-02 11:29

将所有方法放到一个线程执行,然后定时调用该线程。恩,可以...但,总觉得拉取效率太低。

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 11:38

@南小鸟: 你这个a,b,c本来不就是顺序执行吗?如果b,c可以不顺序,可以a执行完再建线程

支持(0) 反对(0) TCG2008 | 园豆:1150 (小虾三级) | 2017-06-02 11:53

@TCG2008: 你的意思是:在一个线程内,1、先调用拉取A1表的方法;2、然后在该线程里面再建立线程,用于拉取A2、A3表的数据。  是这样子么?

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 11:56
0

你这是在做数据备份?

SoNice_LS | 园豆:202 (菜鸟二级) | 2017-06-02 16:15

这倒没有,这是由于需求需要。

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-02 16:48
0

主线程 启动A1线程,A1线程执行完启动A2 和A3线程

★Angel★ | 园豆:202 (菜鸟二级) | 2017-06-04 13:33

谢谢,这是我想到的方法,你看看是不是这个:

        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);
支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2017-06-05 09:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册