多线程批量处理任务数据重复

建华老刘 发布于 2015/01/23 11:14
阅读 1K+
收藏 2
最近在做一个批量处理的任务。
业务场景是这样的,每天生成一批文件(30个),然后将这批文件解析并导入到数据库中,每个文件大小不一,最大的有300多条数据,耗时较长。
每个数据文件的名称是不变的,所以日期加文件名称就生成一个任务ID
我现在准备用多线程处理,但是在这个过程中遇到点问题,如果多个人操作的话,某些任务数据会重复。

所以我在此向大家请教一下:
方案一、
    Action 代码:
    for (final String tasks:task) {
        new Thread(new Runnable() {
            public void run() {
                servce.optionTask(tasks);
            }
        }).start();
    }
    service:代码
    public void optionTask(String taskId) {
        synchronized (taskId.intern()) {
            //处理代码
        }
    }
方案二、
    Action 代码:
    for (final String tasks:task) {
        new Thread(new Runnable() {
            public void run() {
                servce.optionTask(tasks);
            }
        }).start();
    }
    service:代码
    public void optionTask(String taskId) {
        int index = Integer.parseInt(taskId);
        int mod = index % 127;
        synchronized (Integer.valueOf(mod)) {
            //处理代码
        }
    }
方案三、
    Action 代码:
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (String tasks:task) {
                credentialService.optionCredential(tasks);
            }
        }
    }).start();
    service:代码
    private static final byte[] b = new byte[0];
    public void optionTask(String taskId) {
        synchronized (b) {
            //处理代码
        }
    }

首先方案一

    我知道java里String类有字符串池的概念,我的思路是只要任务ID不同的就可以并行执行,任务ID相同的就进行同步。但是测试结果还有数据重复,我猜测是字符串池是有大小的,如果满之后就会执行垃圾回收,所以有的任务ID就被回收了。出现数据重复

方案二、

    Integer类也有池的概念,-128到127是认为用的最多的,所以进行了缓存,所以对象应该是一个。理论来讲应该也是正确的。但是经测试数据也有重复,具体原因不详,请各位指点

方案三、

    方案三经测试数据没有出现重复,但是这样不能并行执行,只能单个执行,效率太慢。

大家还有什么好的建议,请指点一二,不胜感激。
加载中
返回顶部
顶部