当前位置: 首页 > 知识库问答 >
问题:

如何在使用java.text.Collator进行并发排序时避免线程阻塞?

慕容嘉荣
2023-03-14

我在<code>java.text.RuleBasedCollator中遇到线程阻塞问题。getCollationKey()当我的服务器负载过重时。

下面是出现问题的类:

public class DefaultFacetDisplayNameComparator implements Comparator
{
    private final Collator trTRCollator = Collator.getInstance(new Locale("tr", "TR"));

    @Override
    public int compare(final FacetValue value1, final FacetValue value2)
    {
        if (!StringUtils.isEmpty(value1.getDisplayName()) && !StringUtils.isEmpty(value2.getDisplayName()))
        {
            //KOTT-672
            final CollationKey displayName1 = trTRCollator.getCollationKey(value1.getDisplayName());
            final CollationKey displayName2 = trTRCollator.getCollationKey(value2.getDisplayName());
            return displayName1.compareTo(displayName2);
        }
        else if (!StringUtils.isEmpty(value1.getName()) && !StringUtils.isEmpty(value2.getName()))
        {
            //KOTT-672
            final CollationKey name1 = trTRCollator.getCollationKey(value1.getName());
            final CollationKey name2 = trTRCollator.getCollationKey(value2.getName());
            return name1.compareTo(name2);
        }
        else
        {
            return 0;
        }
    }

下面是来自线程转储的一个片段,显示了有问题的阻塞:

" xxxhttp 227 " prio = 5 tid = 0x 355 NID = 0x 163 BLOCKED归hybrishttp 109 Id = 236-stats:CPU = 339 blk =-1 wait =-1 Java . lang . thread . state:BLOCKED at Java . text . rulebasedcollator . getcollationkey(rulebasedcollator . Java:597)-正在等待锁定Java . text . rulebasedcollator @ 1b 9f 75 AC at com . core . commercesearch . search . solrfacetse

如何避免我的服务器线程阻塞,因为线程转储显示它们在做什么?

共有2个答案

邓英卓
2023-03-14

当我在下面这样的例子中摆脱Collator类的使用时,我似乎可以防止阻塞线程,这样它就像一个符咒一样工作!

private static final String TRtr_ALPHABET = "0123456789AaBbCcÇçDdEeFfGgĞğHhIıİiJjKkLlMmNnOoÖöPpQqRrSsŞşTtUuÜüVvWwXxYyZz";

@Override
public int compare(final FacetValue facetValue1, final FacetValue facetValue2)
{
    String value1 = null;
    String value2 = null;

    if (!StringUtils.isEmpty(facetValue1.getDisplayName()) && !StringUtils.isEmpty(facetValue2.getDisplayName()))
    {
        value1 = facetValue1.getDisplayName();
        value2 = facetValue2.getDisplayName();
    }
    else if (!StringUtils.isEmpty(facetValue1.getName()) && !StringUtils.isEmpty(facetValue2.getName()))
    {
        value1 = facetValue1.getName();
        value2 = facetValue2.getName();
    }
    else
    {
        return 0;
    }

    final int length = Math.min(value1.length(), value2.length());
    int i = 0;
    while ((i < length) && (value1.charAt(i) == value2.charAt(i)))
    {
        i++;
    }
    if (i == length)
    {
        return 0;
    }
    if (TRtr_ALPHABET.indexOf(value1.charAt(i)) < TRtr_ALPHABET.indexOf(value2.charAt(i)))
    {
        return -1;
    }
    return 1;
}
充阳秋
2023-03-14

我不会猜到任何ColatorgetColationKey()实现都需要同步,但这就是线程转储似乎显示的内容。问题不清楚,但我倾向于认为,尽管当多个线程共享一个Colator时,这可能会减慢您的应用程序,但它不会死锁它们。

然而,无论哪种方式,最好的解决方案可能是每个线程使用自己的Colator实例,并且最好的方法可能是每个线程都有自己的宿主类实例,DefaultFacetDisplayName的

这确实假设 Collator.getInstance() 每次调用时都会返回不同的 Collator 实例。如果您发现它在不同线程的不同调用中返回相同的实例,并且该实例存在同步问题,则首先提交错误报告;其次,使用不同的技术来获取您的 Collator(也许直接构建适当的 RuleBasedCollator)。

 类似资料:
  • 问题内容: 我发现我的某些活动在启动时被阻止。因此,我在一个新项目中编写了该代码: 结果是第一次创建AdView对象会阻塞UI线程1到2秒钟。 有什么办法可以避免这种情况? 谢谢 问题答案: 您正在UI线程中创建AdView,这就是被阻止的原因。在AdView初始化期间,线程不会执行其他任何操作。 您可以尝试在另一个线程中加载AdView,也可以使用AsyncTask以用户界面安全的方式加载它。

  • Hadoop MapReduce的默认行为是在分区内对schffle键进行排序,但不是跨分区(它是使键跨部分排序的总排序) 我想问如何使用Spark RDD实现同样的事情(分区内排序,但不跨分区排序) < li>RDD的< code>sortByKey方法是进行总排序 < li>RDD的< code > repartitionandsorttwithinpartitions 在分区内进行排序,而不

  • 问题链接1链接2链接3 从上面的链接,我希望我遵循的答案是被接受的。但我还是有例外。我正在使用Java 6。 代码: 堆栈跟踪:

  • 问题内容: 我一直在阅读其他文章,但没有设法解决我的查询。 使用顺序查询要慢20倍,我必须改进它。这是查询: 这些是表(已更新): 使用默认顺序时,它仅使用 index和where ,并使用 index,where,temporary和filesort。 如何使查询按顺序接收结果,而无需文件排序和临时排序。 更新: 我进行了一个新的查询,没有临时或文件排序,但 类型:索引 ,已筛选:7340.00

  • 问题内容: 我有一个,我需要能够对列进行重新排序。但是,我希望第一列不能重新排序。我使用以下命令来启用重新排序: 现在可以对列进行重新排序,包括不需要的第一列。有什么方法可以锁定第一列? 我已经看到一些使用两个表的解决方案,其中第一列在单独的表中,但是也许有更好/更简单的方法。 问题答案: 我认为您需要重写中的方法。在类有一个方法,你应该能够看到,以确定它是否是你的固定列,然后你应该能够取消事件。

  • 我们有一个相当复杂的布局,其中有CollapsingToolbarLayout,底部还有一个RecycerView。 在某些情况下,我们通过调用RecycerView上的setNestedScrollingEnabled(boolean)来临时禁用CollapsingToolbarLayout的展开/折叠。 这通常很好用。 ScrollingActivity.java 起初我认为这是因为其他原因(