我有一个Java多线程问题。我有以下工作类:
使用线程,我正在使用一个ExecutorService:
在这里添加
问题在于递归树的深度非常大,它的宽度也很大,因此向ExecutorService添加了许多ThreadWorkers,因此在大输入上经过一段时间后会出现问题。
这是由于我添加了大量的
有没有一种方法可以获取已添加到
所以我不会在递归中过深或过广,以避免那些抛出异常的情况。
诚挚地,Sergey Aganezov jr.
public class ThreadWorker implements Runnable {
//some code in here
public void run(){
// invokes some recursion method in the ThreadWorker itself,
// which will stop eventually
{
}
使用线程,我正在使用一个ExecutorService:
public static int THREAD_NUMBER = 4;
public static ExecutorServide es = Executors.newFixedThreadPool(THREAD_NUMBER);
在这里添加
ThreadWorker
类的实例。public void recursiveMethod(Arraylist<Integers> elements, MyClass data){
if (elements.size() == 0 && data.qualifies()){
ThreadWorker tw = new ThreadWorker(data);
es.execute(tw);
return;
}
for (int i=0; i< elements.size(); i++){
// some code to prevent my problem
MyClass data1 = new MyClass(data);
MyClass data2 = new MyClass(data);
ArrayList<Integer> newElements = (ArrayList<Integer>)elements.clone();
data1.update(elements.get(i));
data2.update(-1 * elements.get(i));
newElements.remove(i);
recursiveMethod(newElements, data1);
recursiveMethod(newElements, data2);
{
}
问题在于递归树的深度非常大,它的宽度也很大,因此向ExecutorService添加了许多ThreadWorkers,因此在大输入上经过一段时间后会出现问题。
Exception in thread "pool-1-thread-2" java.lang.OutOfMemoryError: Java heap space
这是由于我添加了大量的
ThreadWorkers
到ExecutorService
以执行,因此导致内存不足。每个ThreadWorker
需要大约40 Mb的RAM。有没有一种方法可以获取已添加到
ExecutorService
中的线程数(实现runnable接口的类的实例)?这样我就可以在上面显示的代码中(在“//一些代码来防止我的问题”中)添加它。while ("number of threads in the ExecutorService" > 10){
Thread.sleep(10000);
}
所以我不会在递归中过深或过广,以避免那些抛出异常的情况。
诚挚地,Sergey Aganezov jr.
TreadPoolExecutor es = new ThreadPoolExecutor(4, 4, 10000, TimUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
然后将rejectedHandler设置为它es.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
.在此之后,如果我理解正确,它将处理我的问题,因为一旦运行线程数达到4个并且排队线程数达到10个,下一个添加的任务将被拒绝并在主线程中执行,停止所有其他活动。 - Sergey Aganezov jr