首页 新闻 会员 周边

Java多线程方法没有被执行

0
悬赏园豆:180 [已解决问题] 解决于 2018-08-24 13:28

开启了一个线程池

ExecutorService threadService=Executors.newFixedThreadPool(3);

threadService.submit(new task(Queue));

threadService.submit(new task(Queue));

threadService.submit(new task(Queue));

线程池中放入三个相同的线程,三个线程从同一个阻塞队列拿数据写到文件中。

线程的Run()方法,调用了一个内部方法

public run(){

  file=Queue.take();

  //计数点1:数据取出来(取出来的数据个数)

  writetoFile(file);

  //计数点2:写完文件的个数

}

 

private writetoFile(){

  //计数点3:进入写函数的个数

}

现在队列中放1200个数据,则会发生数据 丢失的情况,因此使用下面的方式对关键点进行计数输出

private static int cout=0;

发现计数点1与1200吻合。计数点2总比计数点3多1,则说明剩下的次数均没有进入doSomething()函数,其中一次的数据如下:

计数点1:1200   //计数点1的数据很稳定(说明:数据都从阻塞队列中拿出来了)

计数点2:1180  //计数点2,3的数据每次都有浮动,但不是1200,总有丢失的情况,说明写函数不是每一次都执行了

计数点3:1181

 

可是顺序结构的代码,为什么会平白无故的没有进入函数呢,就想到了可能是线程的原因 ,还请大佬们指点一下。

Rekent的主页 Rekent | 初学一级 | 园豆:91
提问于:2018-07-22 23:09
< >
分享
最佳答案
0

因FileLock的锁造成

Rekent | 初学一级 |园豆:91 | 2018-08-06 11:01

最佳答案0园豆惨案

山抹微云君^^ | 园豆:274 (菜鸟二级) | 2018-08-24 17:26
其他回答(4)
0

private static int cout=0; 多个线程用的话,线程不安全,和这个有关吧

收获园豆:45
2012 | 园豆:21230 (高人七级) | 2018-07-23 08:38
0

你的count是对run方法执行次数进行统计的吧,你private static volatile int cout=0; 这样试试

收获园豆:45
让我发会呆 | 园豆:2929 (老鸟四级) | 2018-07-23 08:54
0

count用这个volatile 修饰 试试

收获园豆:45
^keepHungry$ | 园豆:516 (小虾三级) | 2018-07-23 10:06
0

volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。可以确保变量不会被优化,能被其他线程看到。建议将count加上volatile试试。

收获园豆:45
山抹微云君^^ | 园豆:274 (菜鸟二级) | 2018-08-02 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册