创建一个同步多线程系统,以确定三个文本文件中所有整数或分数的总数。如果流被阻塞,则必须将其名称显示为"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);
}
}
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调试器分析,对我来说没有什么奇怪的。