首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java多线程导致数据库死锁(Java 7)

Java多线程导致数据库死锁(Java 7)
EN

Stack Overflow用户
提问于 2018-05-31 02:15:39
回答 1查看 93关注 0票数 0

我想设计一个多线程模块,我设置了两个类并设计如下:

ThreadConcurrentWoker.class:

代码语言:javascript
复制
public class ThreadConcurrentWoker<E, R> extends ThreadConcurrent<E, R> {

public ThreadConcurrentWoker(List<E> traget, CallableModel<E, R> callable) {
    super.targetList = traget; // a list want to doing in thread.
    super.callable = callable; // Custom callable object
    super.results = new Vector<R>(); // get result in to this list
}

// this is doing Thread method
@Override
public List<R> concurrentExcute() throws Exception {

    ExecutorService executor = Executors.newFixedThreadPool(super.targetList.size());
    CompletionService<R> completionService = new ExecutorCompletionService<R>(executor);
    for (final E elememt : super.targetList) {
        completionService.submit(new Callable<R>() {
            @Override
            public R call() throws Exception {
                callable.setElement(elememt);
                return callable.call();
            }
        });
    }

    int finishs = 0;
    boolean errors = false;

    while (finishs < super.targetList.size() && !errors) {
        Future<R> resultFuture = completionService.take();
        try {
            super.results.add(resultFuture.get());
        } catch (ExecutionException e) {
            errors = true;
        } finally {
            finishs++;
        }
    }
    return super.results;
}

}

CallableModel.class:

代码语言:javascript
复制
public abstract class CallableModel<E, V> implements Callable<V> {
    private E element;

    public E getElement() {
        return element;
    }

    public void setElement(E element) {
        this.element = element;
    }

}

我想这样用:

代码语言:javascript
复制
ThreadConcurrentWoker<FlowPendingCheckedBean, ResultBean> tCUtil = 
new ThreadConcurrentWoker<>(test, new CallableModel<FlowPendingCheckedBean, ResultBean>() {

    @Override
    public ResultBean call() throws Exception {
        // do something in here and return result.
    }

});
try {
    resultBeans = tCUtil.concurrentExcute();
} catch (Exception e1) {
    log.error(e1.getMessage());
}

但是,当我执行这个类时,它将在不同的线程中获得相同的数据。导致数据库出现死锁。我该如何改进呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 03:35:58

我试过这个问题。写下笔记:

因为多线程使用相同的CallableModel元素,所以当调用方法中的第一个线程,将第二个线程转换为setEelement元素时,第一个线程将得到第二个线程的元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50615715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档