我是begginer,并保持自己的倾向。如何组织多线程与队列一起工作?
我需要做的组织multithreadings在文件中查找:
用户输入那里找到(路径),并在查找内容(字);
- 第一个线程在文件夹中找到
.txt
文件并将结果添加到队列中; - 当队列中有一些文件=>第二个线程开始在这个文件中查找 需要查找什么(字)。
- 如果被发现成功将显示路径这个文件+这个词在文件中遇到多少次。
Qestions:
- 我们可以使用ArrayList(或存在任何替代)队列与线程数的作品?
- 如果队列为空,第二个线程不启动,但在第一次发现需要文件时等待?
- 需要我们使用同步这个任务,并继承
MultiThreadingSearch
(或更好地使用组合)?
代码:
import java.util.*;
import java.io.*;
class ArrayListOfFiles {
private Node first, last;
private class Node {
String item;
Node next;
}
public boolean isEmpty() {
return first == null;
}
public synchronized void enqueue(String item) {
Node oldlast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty())
first = last;
else
oldlast.next = last;
}
public synchronized String dequeue() {
String item = first.item;
first = first.next;
if (isEmpty())
last = null;
return item;
}
}
class FolderScan extends MultiThreadingSearch implements Runnable {
FolderScan(String path, String whatFind) {
super(path, whatFind);
}
@Override
public void run() {
findFiles(path);
}
ArrayListOfFiles findFiles(String path) {
File root = new File(path);
File[] list = root.listFiles();
for (File titleName : list) {
if (titleName.isDirectory()) {
findFiles(titleName.getAbsolutePath());
} else {
if (titleName.getName().toLowerCase().endsWith((".txt"))) {
textFiles.enqueue(titleName.getName());
}
}
}
return textFiles;
}
}
class FileScan extends MultiThreadingSearch implements Runnable {
Scanner scanner = new Scanner((Readable) textFiles);
Set<String> words = new HashSet<String>();
int matches = 0;
FileScan(String file, String whatFind) {
super(file, whatFind);
Thread wordFind = new Thread();
wordFind.start();
}
@Override
public void run() {
while (scanner.hasNext()) {
String word = scanner.next();
words.add(word);
}
if (words.contains(this.whatFind)) {
System.out.println("File:" + this.path);
matches++;
}
System.out.println(matches);
}
}
public class MultiThreadingSearch {
String path;
String whatFind;
ArrayListOfFiles textFiles;
MultiThreadingSearch(String path, String whatFind) {
this.path = path;
this.whatFind = whatFind;
this.textFiles = new ArrayListOfFiles();
Thread pathFind = new Thread(new FolderScan(path, whatFind));
// pathFind.start();
if (!textFiles.isEmpty()) {
@SuppressWarnings("unused")
FileScan fileScan = new FileScan(textFiles.dequeue(), whatFind);
}
}
// ask user about input
public static void askUserPathAndWord() {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
String path;
String whatFind;
try {
System.out.println("Please, enter a Path and Word"
+ "(which you want to find):");
System.out.println("Please enter a Path:");
path = bufferedReader.readLine();
System.out.println("Please enter a Word:");
whatFind = bufferedReader.readLine();
if (path != null && whatFind != null) {
new MultiThreadingSearch(path, whatFind);
System.out.println("Thank you!");
} else {
System.out.println("You did not enter anything");
}
} catch (IOException | RuntimeException e) {
System.out.println("Wrong input!");
e.printStackTrace();
}
}
public static void main(String[] args) {
askUserPathAndWord();
}
}
我从这个代码得到Exception in thread "main" java.lang.StackOverflowError
。
如何能够解决这个任务?
谢谢,
Nazar。
哪里(在哪一行)没有异常发生的? – rtheunissen 2013-02-19 10:55:41
我怀疑在您发布的代码中未包含的某行上发生了异常。我在这里看不到任何会导致StackOverflowError – NickJ 2013-02-19 10:58:31
线程中的异常“主”java.lang.StackOverflowError \t at task.MultiThreadingSearch。(MultiThreadingSearch.java:101) \t at task.FolderScan。 (MultiThreadingSearch.java:41)' - 我没想到这回合 –
2013-02-19 11:05:41