我正在编写一个Java程序来解决这个问题:
我有一个包含值的平衡树(即Java中的TreeSet)。我有“任务”对象,它们将执行以下两种操作之一:尝试在树中查找值,或向树中添加值。我将有一个这些“任务”对象的列表(我在Java中使用了LinkedList),我创建线程来逐个读取和删除此列表中的任务并执行他们所需的操作(即,查找或添加一个值树)。我为我的任务列表创建了一个同步的“删除”方法(它只是调用底层的LinkedList的“删除”方法)。我还定义了要同步的树的“添加”方法...(我不知道是否需要同步它,但我认为它是。)
使用多个线程时,如何提高此程序的性能?现在,如果我使用单个线程,则时间比使用多个线程时更好。
这是我的run
类的TaskRunner
方法,我的线程是此类的对象,它实现了Runnable
,tasks
是包含任务和{{{ 1}}是我在构造函数中传递给此对象的tree
:
TreeSet
此外,我的树继承自Java中的Task task;
int action; // '0' for search, '1' for add
int value; // Value to be used for searching or adding
while (!tasks.isEmpty()) {
try { task = tasks.remove(); }
catch (NoSuchElementException ex) { break; }
action = task.getAction();
value = task.getValue();
if (action == 0)
boolean found = tree.contains(value);
else
tree.add(value);
}
,我将其TreeSet<Integer>
方法定义为add
:
synchronized
我的任务列表继承自public synchronized boolean add(Integer e) {
return super.add(e);
}
及其LinkedList<Task>
方法:
remove
答案 0 :(得分:0)
如果您的任务类实现了Runnable
接口,则可以使用ThreadPool来处理任务。
这是一个例子:
public class TreeSetTaskExample {
public static class Task implements Runnable {
String value;
boolean add;
Set<String> synchronizedTreeSet;
public Task(String value, boolean add, Set<String> synchronizedTreeSet) {
this.value = value;
this.add = add;
this.synchronizedTreeSet = synchronizedTreeSet;
}
@Override
public void run() {
String threadName = Thread.currentThread().toString();
if (add) {
System.out.println(threadName + "# add: " + value);
synchronizedTreeSet.add(value);
} else {
boolean contains = synchronizedTreeSet.contains(value);
System.out.println(threadName + "# treeSet.contains: " + value + " = " + contains + " removed...");
if (contains) {
synchronizedTreeSet.remove(value);
}
}
}
}
public static void main(String[] args) throws InterruptedException {
//
// synchronizedSet
//
Set<String> treeSet = Collections.synchronizedSet(new TreeSet<String>());
//
// ThreadPool with ? Threads
//
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService threadPool = Executors.newFixedThreadPool(processors);
for (int i = 0; i < 100; i++) {
String someValue = "" + (i % 5);
boolean addOrCheck = Math.random() > 0.5;
threadPool.execute(new Task(someValue, addOrCheck, treeSet));
}
//
// don't forget to kill the threadpool
//
threadPool.shutdown();
}
}