我有一个项目,我必须创建一个WordCounter ..我已经做到了,它工作正常。
然后我需要建立一个队列,这样我就可以得到文本的不同长度并将它们加在一起并打印出来。
我已经建立了一个队列,并尝试将其打印出来,同时打印出文本中的字数,并且可以看到它将数字添加到队列中。
但后来我无法弄清楚如何将这些数字从队列中删除,以便我可以将它们加在一起
这是我的WordCounterTester
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class WordCountTest {
public static void main(String[] args){
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
for(int i = 0; i< args.length; i++){
Runnable r = new WordCount(args[i],queue);
Thread t = new Thread(r);
t.start();
}
}
}
我的WordCounter
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.concurrent.BlockingQueue;
class WordCount implements Runnable {
public int result;
private String s;
Thread runner;
private BlockingQueue<String> queue;
public WordCount(String s, BlockingQueue<String> queue){
this.s = s;
this.queue = queue;
}
public void run() {
try{
FileReader fr = new FileReader(s);
Scanner scanner = new Scanner(fr);
for(int i = 0; true; i++){
result = i;
scanner.next();
}
}catch(FileNotFoundException e){
System.out.println("Du har skrevet en fil der ikke findes, den fil vil blive skrevet ud med 0 ord");
}
catch(NoSuchElementException e){}
System.out.println(s + ": " + result);
Integer.toString(result);
queue.add(result + "");
System.out.println(queue);
}
}
当我使用6个不同的.txt运行程序时,我现在得到的顺序可能会有所不同,因为它是多线程的,所以首先要做的不同:)
5.txt: 1
[1]
6.txt: 90
[1, 90]
4.txt: 576
[1, 90, 576]
3.txt: 7462
[1, 90, 576, 7462]
1.txt: 7085
[1, 90, 576, 7462, 7085]
2.txt: 11489
[1, 90, 576, 7462, 7085, 11489]
有没有人知道如何才能做到这一点?
答案 0 :(得分:1)
我认为你缺少的是main
需要加入它们在每个文件添加到队列之后产生的线程。
public static void main(String[] args){
final BlockingQueue<Integer> queue = new LinkedBlockingQueue<String>();
Thread[] threads = new Thread[args.length];
for (int i = 0; i< args.length; i++){
Runnable r = new WordCount(args[i], queue);
threads[i] = new Thread(r);
threads[i].start();
}
// wait for the threads to finish
for (Thread t : threads) {
t.join();
}
int total = 0;
for (Integer value : queue) {
total += value;
}
System.out.println(total);
}
在这里的代码中,我已经实现了@Ben van Gompel建议将Integer
添加到队列而不是String
。
您还可以使用AtomicInteger
类并执行以下操作:
final AtomicInteger total = new AtomicInteger(0);
...
Runnable r = new WordCount(args[i], total);
...
// join loop
// no need to total it up since each thread would be adding to the total directly
System.out.println(total);
在WordCount代码中,您可以使用AtomicInteger
之类的内容:
System.out.println(s + ": " + result);
// add the per-file count to the total
total.incrementAndGet(result);
// end
答案 1 :(得分:0)
首先,我将队列类型更改为BlockingQueue<Integer>
,因为使用String
似乎没有任何意义。线程完成后(为什么还要使用线程?),你应该迭代queue
中的值并将它们全部加起来。
int total = 0;
for (Integer value : queue) {
total += value;
}
System.out.println(total);