開啟了一個(gè)線程池ExecutorService threadService=Executors.newFixedThreadPool(3);threadService.submit(new task(Queue));threadService.submit(new task(Queue));threadService.submit(new task(Queue));線程池中放入三個(gè)相同的線程,三個(gè)線程從同一個(gè)阻塞隊(duì)列拿數(shù)據(jù)寫到文件中。線程的Run()方法,調(diào)用了一個(gè)內(nèi)部方法public run(){ file=Queue.take(); //計(jì)數(shù)點(diǎn)1:數(shù)據(jù)取出來(取出來的數(shù)據(jù)個(gè)數(shù)) writetoFile(file); //計(jì)數(shù)點(diǎn)2:寫完文件的個(gè)數(shù)} private writetoFile(){ //計(jì)數(shù)點(diǎn)3:進(jìn)入寫函數(shù)的個(gè)數(shù)}現(xiàn)在隊(duì)列中放1200個(gè)數(shù)據(jù),則會(huì)發(fā)生數(shù)據(jù) 丟失的情況,因此使用下面的方式對(duì)關(guān)鍵點(diǎn)進(jìn)行計(jì)數(shù)輸出private static int cout=0;發(fā)現(xiàn)計(jì)數(shù)點(diǎn)1與1200吻合。計(jì)數(shù)點(diǎn)2總比計(jì)數(shù)點(diǎn)3多1,則說明剩下的次數(shù)均沒有進(jìn)入doSomething()函數(shù),其中一次的數(shù)據(jù)如下:計(jì)數(shù)點(diǎn)1:1200 //計(jì)數(shù)點(diǎn)1的數(shù)據(jù)很穩(wěn)定(說明:數(shù)據(jù)都從阻塞隊(duì)列中拿出來了)計(jì)數(shù)點(diǎn)2:1180 //計(jì)數(shù)點(diǎn)2,3的數(shù)據(jù)每次都有浮動(dòng),但不是1200,總有丟失的情況,說明寫函數(shù)不是每一次都執(zhí)行了計(jì)數(shù)點(diǎn)3:1181 可是順序結(jié)構(gòu)的代碼,為什么會(huì)平白無故的沒有進(jìn)入函數(shù)呢,就想到了可能是線程的原因 ,還請(qǐng)大佬們指點(diǎn)一下。
Java多線程方法沒有被執(zhí)行
慕工程0101907
2018-08-17 11:10:46