Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的线程未并发运行_Java_Multithreading - Fatal编程技术网

java中的线程未并发运行

java中的线程未并发运行,java,multithreading,Java,Multithreading,我在Java中遇到了多线程问题。我需要将一个大的名称列表与其自身进行比较(以找到几乎相同的名称) 我将工作分成4个不同的线程,每个线程将列表的1/4与完整列表进行比较。我对所有4个线程使用相同的类 当我查看线程监视器时,我看到它们实际上并不是并发运行的,而是一个接一个地处于活动状态 有什么问题吗 这是我的线程类的run方法: @Override public void run() { try { s = settings.conn.createSt

我在Java中遇到了多线程问题。我需要将一个大的名称列表与其自身进行比较(以找到几乎相同的名称)

我将工作分成4个不同的线程,每个线程将列表的1/4与完整列表进行比较。我对所有4个线程使用相同的类

当我查看线程监视器时,我看到它们实际上并不是并发运行的,而是一个接一个地处于活动状态

有什么问题吗

这是我的线程类的run方法:

@Override
    public void run() {
        try {
            s = settings.conn.createStatement();
            JaroWinklerDistance jw = JaroWinklerDistance.JARO_WINKLER_DISTANCE;

        for (int i = 0; i < names.size(); i++) {
            for (int j = 0; j < allNames.size(); j++) {
                if (j % 250 == 0) {
                }
                double proximity = jw.proximity(names.get(i), allNames.get(j));
                if (proximity > Double.parseDouble(settings.properties.getProperty("distanceTreshold")) && proximity < 1.00) {
                    if (names.get(i).length() > allNames.get(j).length()) {
                        substituteName(allNames.get(j), names.get(i));
                        allNames.remove(allNames.get(j));
                    } else {
                        substituteName(names.get(i), allNames.get(j));
                        names.remove(names.get(i));
                        break;
                    }
                }
            }
        }
    } catch (SQLException ex) {
        Exceptions.printStackTrace(ex);
    }
}
@覆盖
公开募捐{
试一试{
s=settings.conn.createStatement();
JaroWinklerDistance jw=JaroWinklerDistance.JARO_-WINKLER_距离;
对于(int i=0;iDouble.parseDouble(settings.properties.getProperty(“distanceTreshold”)&&approxity<1.00){
if(names.get(i).length()>allNames.get(j).length()){
substituteName(allNames.get(j),names.get(i));
allNames.remove(allNames.get(j));
}否则{
substituteName(names.get(i),allNames.get(j));
name.remove(name.get(i));
打破
}
}
}
}
}catch(SQLException-ex){
例外情况。printStackTrace(ex);
}
}
substituteName方法执行更新记录的SQL查询

创建的线程如下所示:

settings.getAllNames();
        int size = settings.allNames.size();
        int rest = size % 4;
        int groupSize = (size-rest) / 4;

        GroupNormalizer a = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList(0, groupSize)));
        GroupNormalizer b = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList(groupSize, (groupSize*2))));
        GroupNormalizer c = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList((groupSize * 2), (groupSize * 3))));
        GroupNormalizer d = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList((groupSize * 3), (groupSize*4 + rest))));
        a.start();
        b.start();
        c.start();
        d.start();
settings.getAllNames();
int size=settings.allNames.size();
int rest=大小%4;
int groupSize=(剩余大小)/4;
GroupNormalizer a=newgroupnormalizer(settings.allNames,newarraylist(settings.allNames.subList(0,groupSize));
GroupNormalizer b=newgroupnormalizer(settings.allNames,newarraylist(settings.allNames.subList(groupSize,(groupSize*2)));
GroupNormalizer c=newgroupnormalizer(settings.allNames,newarraylist(settings.allNames.subList((groupSize*2)、(groupSize*3)));
GroupNormalizer d=newgroupnormalizer(settings.allNames,newarraylist(settings.allNames.subList)((groupSize*3),(groupSize*4+rest));
a、 start();
b、 start();
c、 start();
d、 start();
编辑:所有4个线程在运行和监视(被阻止)之间交替很多-状态(线程池)来拯救

线程池管理工作线程池。线程池 包含一个工作队列,其中包含等待执行的任务


试试看

hmm这条线似乎导致了同步锁定:

if (proximity > Double.parseDouble(settings.properties.getProperty("distanceTreshold")) && proximity < 1.00)
if(接近度>Double.parseDouble(settings.properties.getProperty(“distanceTreshold”)&&approxity<1.00)
尝试将Double.parseDouble从循环中拉出,因为在我看来,其中的所有内容都是常量

似乎设置对象正在阻止ob访问,并以这种方式减慢您的速度


此外,在计算(捕捉SQLEx)过程中,您似乎正在访问DB,这将使您的速度降低很大一部分。尝试将读写与计算过程分开。

在Java中同时从多个线程使用Double.parseDouble存在一个已知问题。它在内部用于进行解析的方法是同步的,因此如果有许多线程同时调用它,那么这些线程最终会阻塞

这应该在Java8中修复

(请参阅Java错误报告JI-9004591-“从多个线程调用Double.parseDouble时监视争用”-)


我怀疑这就是为什么在已接受的答案中所做的更改(将Double.parseDouble移出)提高了性能。

如果没有看到您的代码,很难说有些代码会很好地分析可能的错误。我使用的是四核。thread类比较大列表的一部分。如果它发现一个几乎重复的,它会相应地更新数据库记录,也许你可以给我们一些源代码,在那里创建和启动线程?你在线程中有某种锁定机制吗?我以前有过,但我得到了相同的结果。我所做的是Executors服务=Executors.newFixedThreadPool(4);es.submit(新线程..)U确保它不是单核celeron?Intel core i7-2670QM@2.20GHz,带8 GB内存i按照您的建议执行,发现多个线程正在访问settings.properties文件。我修复了这个问题,现在看起来更好了。我还将计算与读/写分离,现在它们同时运行(它们总是等待访问数据库)