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

为什么只算一个文件

慕容念
2023-03-14

创建一个同步多线程系统,以确定三个文本文件中所有整数或分数的总数。如果流被阻塞,则必须将其名称显示为"LOCKED"。为什么只计算一个文件(带锁的线程)?程序显示的内容:Thread-0 Locked!线程-2锁定!123.321 322099只有一个文件

import java.io.*;
    import java.util.*;
    import java.util.concurrent.locks.*;
     
    public class Dispatcher {
     
        public static void main(String[] args) throws InterruptedException {
     
            SumOfDigits sumOfDigits = new SumOfDigits();
     
            Thread thread = new Handler(new File("text.txt"), sumOfDigits);
            Thread thread2 = new Handler(new File("text2.txt"), sumOfDigits);
            Thread thread3 = new Handler(new File("text3.txt"), sumOfDigits);
            thread.start();
            thread2.start();
            thread3.start();
            thread.join();
            thread2.join();
            thread3.join();
     
            System.out.println(sumOfDigits.resultDouble + " " + sumOfDigits.resultInt);
        }
     
    }
     
     
    class SumOfDigits {
        double resultDouble;
        int resultInt;
        Lock lock = new ReentrantLock();
     
        void sum(File file) {
            try (Scanner sc = new Scanner(file)) {
                int tempInt = 0;
                double tempDouble = 0;
                while (sc.hasNext()) {
                    String num = sc.next();
                    if (num.contains(".")) {
                        tempDouble += Double.parseDouble(num);
                    } else {
                        tempInt += Integer.parseInt(num);
                    }
                }
                boolean flag = lock.tryLock();
                if (flag) {
                    try {
                        resultDouble += tempDouble;
                        resultInt += tempInt;
                    } catch (Exception e) {
                    } finally {
                        lock.unlock();
                    }
                } else {
                    System.out.println(Thread.currentThread().getName() + " Locked!");
                }
     
            } catch (Exception e) {
            }
        }
    }
     
    class Handler extends Thread {
        File file;
        SumOfDigits sumOfDigits;
     
        Handler(File file, SumOfDigits sumOfDigits) {
            this.file = file;
            this.sumOfDigits = sumOfDigits;
        }
     
        @Override
        public void run() {
            sumOfDigits.sum(file);
        }
    }

共有1个答案

邓元白
2023-03-14

ReentrantLock记录当前线程锁定它的次数。每次调用unlock()时,此计数都会减少,当计数为零时,锁就会释放。因此,要解锁锁,必须调用unlock()的次数与调用lock()tryLock()的次数相同。

在代码中,调用tryLock(),如果成功,则在try/finally块中调用lock(),然后调用unlock()一次。

因此,第一个锁定ReentantLock的线程会将计数增加到两个,但只会将计数减少到一个,因此锁永远不会被释放。因此,没有其他线程可以获得锁。

您应该使用tryLock()lock()来锁定ReentrantLock,而不是两者都使用。

 类似资料:
  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

  • 问题内容: 我读到每个应用程序都在自己的JVM中运行。为什么会这样呢?他们为什么不让一个JVM运行2个或更多应用程序? 我说的是通过公共静态void main(String [])方法启动的应用程序…) 问题答案: (我假设您正在谈论通过方法启动的应用程序…) 理论上,您可以在JVM中运行多个应用程序。实际上,它们可以以各种方式相互干扰。例如: JVM具有一组System.in/out/err,一

  • 问题内容: 我只是想知道… 为什么我只有一个Calendar对象实例。有一个单例的原因吗? 我试图阅读文档,但他们没有提及为什么需要这样做。快速谷歌搜索没有给我任何答案。 问题答案: 日历不是单例,它是一个抽象类。该方法是一个Factory方法,它返回Calendar类的具体实现。 在Google上搜索java.util.Calendar源代码,您将看到它的工作方式。

  • 问题内容: 我正在使用“替换”功能删除div中的所有非数字值。 看来Jquery replace只影响第一个元素。 这是我的Jquery: HTML代码: 结果: 2011 c20ff113。c201gf76341。 我想要的结果是: 2011 20113 20176341 问题答案: 您有重复的ID,这是无效的,并且还有jQueryID选择器(或jQuery内部使用的任何其他ID选择器,例如do

  • 我编写了代码示例: 每100毫秒提交一个新任务(总任务量-20)。每个任务持续时间-0.5秒。因此,可以并行执行5个任务,最佳执行时间为:20*100 500=2.5秒,池应创建5个线程 但我的实验显示为9.6秒。我打开jsvisualvm查看池创建了多少线程,我看到只创建了一个线程: 请更正我的线程池配置不正确的地方。

  • 在这里你可以下载一个acroform字段的pdf,他的大小正好是427KB 如果我删除这个唯一的字段,文件只有3KB,为什么会发生这种情况?我试着用PDF调试器分析,对我来说没有什么奇怪的。