bl_dbe
bl_dbe
采纳率100%
2018-07-09 23:39

关于JAVA线程池的一个问题,请各位大虾指教

40
已采纳

各位大虾,兄弟我最近用JAVA写了一个应用程序,其中用到了线程。现在的问题是:如果不使用线程池,则结果正确(测试了多次);若使用线程池,则结果一般不正确(结果中有时多出一些数据,有时少些数据)。
代码太长,不能全部贴出,只能贴出其基础逻辑。请高手指点改进方向或问题可能存在哪些方面。多谢!
附加信息(不知是否有用):兄弟机器的处理器为Intel(R) Core(TM) i5-5200U CPU @ 2.2GHz 2.19GHz
哪位大虾的回答如果真的有用,我会想办法追加C币,绝不食言!
public class PieceUpStarter {
...
public static ConcurrentHashMap map = new ConcurrentHashMap();
public static ConcurrentHashMap ttMap = new ConcurrentHashMap();
public static ConcurrentHashMap ftMap = new ConcurrentHashMap();
public static ExecutorService pool = Executors.newFixedThreadPool(5);
public static void main(String[] args) {
...
new Search().visit(map);
...
}
}
class SixDegreeBFS extends Thread {
ConcurrentHashMap map = null;
int i = 0;
public SixDegreeBFS(ConcurrentHashMap map, int i) {
this.map = map;
this.i = i;
}

public void run() {
if (map.get(i).getVisited() == 0) {
...
} else {
...
}
}
}
class Search {
void visit(ConcurrentHashMap map) {
...
for (Integer i : map.keySet()) {
Thread thread = new SixDegreeBFS(map, i.intValue());
PieceUpStarter.pool.submit(thread);
}

}
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • qq_38544577 qq_38544577 3年前

    @Autowired

    private TaskExecutor taskExecutor;
    private CountDownLatch cdl=null;
    @ResponseBody
    @RequestMapping("/cc")
    public void sys() throws InterruptedException{
    List list =Collects.Collections.synchronizedList(new ArrayList());
    for(int j=0;j<100000;j++){
    list.add(j);
    }
    cdl=new CountDownLatch(list.size());
    //线程池+同步块

    for(int j=0;j<list.size();j++){
    final int index=j;
    taskExecutor.execute(new Runnable() {
    @Override

    public void run() {

    System.out.println(list.get(index));
    cdl.countDown();
    }

    });
    }
    cdl.await();
    看看这个对你有帮助没

    点赞 评论 复制链接分享
  • bl_dbe bl_dbe 3年前

    程序已经调好。在调试过程中收获了一些经验,愿分享:1、summit方法可能藏匿问题(不显示一些空指针异常之类的信息),使用exacute方法后则无此问题。2、避免一些基本的愚蠢操作(本应用开发原代码中,反复检查后才发现犯了一些基础错误,如应实现runnable接口而不是继承Thread类;再如并发时remove方法在当前代码中不起作用等)。3、在编写并发代码时,在心里要时时想着“并发”,不要在潜意识里还在以传统方式思考问题。
    共有两位小哥回答了问题,在此一并感谢你们的热心!
    好像只能采纳一个答案,我只能选择其中的一位给C币,委屈另一位了!

    点赞 评论 复制链接分享
  • lzx122133 lzx122133 3年前

    确定代码没问题的情况下,(传值是否正确),开启多线程,打开JVM监控线程情况,查看cpu使用状态。打印看看,线程池是否正确的走完一个流程

    点赞 评论 复制链接分享

相关推荐