开启了一个线程池
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
可是顺序结构的代码,为什么会平白无故的没有进入函数呢,就想到了可能是线程的原因 ,还请大佬们指点一下。
因FileLock的锁造成
最佳答案0园豆惨案
private static int cout=0; 多个线程用的话,线程不安全,和这个有关吧
你的count是对run方法执行次数进行统计的吧,你private static volatile int cout=0; 这样试试
count用这个volatile 修饰 试试
volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。可以确保变量不会被优化,能被其他线程看到。建议将count加上volatile试试。