(线程:持续时间)-->(1:16)、(2,3:32)、(4,5,6,7:47)、(8,9:31)...(17,18,19,20:16)
该项目有2个项目:
工人阶层:
public class Worker implements Runnable {
private List<Integer> records;
private long[] res;
private String name;
Worker(String name, LinkedList<Integer> list, long[] res) {
this.records = list;
this.res = res;
this.name = name;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
long sum = 0;
int max, min;
if (records != null && records.size() > 0) {
max = min = records.get(0);
for (Integer num : records) {
sum += num;
if (num > max)
max = num;
if (num < min)
min = num;
}
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
res[0] = sum;
res[1] = max;
res[2] = min;
res[3] = duration;
System.out.println(name + "\t->\ttime:\t" + duration + "\t, Records:\t" + records.size());
}
}
}
主类:
public class Main {
public static void main(String[] args) {
//read command and get inputs:
System.out.println("Welcome to my app : ");
while (true) {
Scanner scanner = new Scanner(System.in);
String command = scanner.nextLine().trim();
if (command.startsWith("compute")) {
command = command.substring("compute".length() + 1);
args = command.split(" ");
} else {
System.out.println("wrong command.. this app only support 'compute'");
exit(1);
}
Map<String, String> map = new HashMap<>(); //-p processes , -f filepath
for (int i = 0; i < args.length - 1; i += 2)
map.put(args[i], args[i + 1]);
File txtFile = new File(map.get("-f").trim());
final int threadCount = Integer.parseInt(map.get("-t").trim());
ArrayList<LinkedList<Integer>> lists = readFile(txtFile, threadCount);
if (lists == null) {
System.out.println("Error: can not found txt file..");
exit(2);
}
long[][] results = new long[threadCount][4];
Thread[] thread = new Thread[threadCount];
for (int i = 0; i < threadCount; i++) {
thread[i] = new Thread(new Worker("thread " + (i + 1) ,lists.get(i), results[i]));
thread[i].start();
}
boolean isAlive = true;
while (isAlive) {
isAlive = false;
for (int i = 0; i < threadCount; i++)
isAlive |= thread[i].isAlive();
}
long[] res = null;
for (long[] result : results) {
if (res != null) {
res[0] += result[0];
if (res[1] < result[1])
res[1] = result[1];
if (res[2] > result[2])
res[2] = result[2];
if (res[3] < result[3])
res[3] = result[3];
} else {
res = result;
}
}
if (res != null) {
System.out.println("sum : " + res[0]);
System.out.println("max : " + res[1]);
System.out.println("min : " + res[2]);
System.out.println("duration : " + res[3]);
}
}
}
private static ArrayList<LinkedList<Integer>> readFile(File txtFile, int procCount) {
if(!txtFile.exists() || txtFile.isDirectory())
return null;
ArrayList<LinkedList<Integer>> arrayList = new ArrayList<>();
for(int i = 0; i < procCount; i++)
arrayList.add(new LinkedList<>());
try {
int index = 0;
BufferedReader bufferedReader = new BufferedReader(new FileReader(txtFile));
String line;
while ((line = bufferedReader.readLine()) != null) {
arrayList.get(index).add(Integer.parseInt(line));
index++;
if(index == procCount)
index = 0;
}
return arrayList;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
您的“不寻常”的结果很可能与JIT编译器所做的优化有关
您的代码在这里使用可配置的线程数进行“某种基准测试”。对于这样的基准测试,建议使用JMH框架。
如果您刚刚学习多线程,我建议您避免测量代码的性能。在做基准测试时,有很多事情需要考虑,如果做得不好,就会导致意想不到的结果,比如您现在看到的结果。
问题内容: 从MDN: bind()方法创建一个新函数,该函数在调用时将其this关键字设置为提供的值 我可以很高兴地看到它在此示例中有效: 哪个日志。 但是,如果我链接了另一个绑定调用,甚至是“调用”调用,我仍然会使用分配给第一个绑定的对象的“ this”来调用函数。例子: 和 两者都记录了日志,而不是我期望的:。 无论我链接多少个绑定调用,似乎只有第一个都起作用。 为什么? 这可能会有所帮助。
问题内容: 因此,我希望它不会被编译,并且不会: 但这确实是: 是什么赋予了?它也不应该编译吗? 另外,由于运算符,这个问题很难找到。 问题答案: Java将工作解释为1加2。请参见Unary运算符部分。
我的Windows批处理文件中出现了“此时转到意外”错误。就像下面一样。我不知道。有人能帮我吗?谢谢
Kafka2.12-1.1.0 你知道吗?
问题内容: 我是java的新手,我的问题是,按下键后输出显示2个数字,但我不明白为什么。 这是代码: 问题答案: 尽管我不能重现该问题:(请参阅此处),但我的建议是也打印出字符(作为整数)。这将帮助您调试:
我试图有一个引导模式显示的页面加载,但相反,我得到一个空白的白色屏幕。 我使用的是ASP.NET核心,我希望模式显示当我的视图加载。 我使用而不是尝试了相同的模式,它工作得很好。我知道这对我的bootstrap和jquery不是问题,因为我在php中尝试了这个模式,它可以工作。 我的代码如下 null null