0

我有一个树结构,我正在尝试使用递归方法来添加、获取或删除项目。我希望能够为使用迭代器找到的每个子节点引入一个新线程。我目前在调用它时将节点传递给递归方法。我希望能够启动一个线程并告诉该线程调用该方法。我将如何做类似于说新线程 thread.callMethod() 的事情?我显然需要一个 Runnable 接口和一个运行方法?然而,这似乎使事情变得比必要的复杂得多(我已经有了方法名称)。有谁知道使用 run(..) 的好方法,或者有谁知道不使用 run(..) 的更好方法。谢谢。

谢谢您的回答。我一直在想我需要获得一个在新线程上运行的节点的新实例,但事实并非如此。节点只占用内存空间,线程引用了在内存中的实例上执行的方法代码(我的 CS 302 TA 在我的脑海中已经不同意我的看法)。所以..我一直在考虑枚举,但我在想我可能需要在实例化期间以某种方式让我的所有节点在单独的线程上运行,或者让方法实际编写在实现可运行的新类中。

换句话说,

public class TreeMethods implements Runnable
{
...
    run(.. node, .. params, .. enum)
    {
        switch(enum)
        case(add)
        {
             myThreadInstanceMethod(node);
        }
    ...
    }
    myThreadInstanceMethod(..) {..}
}

谢谢。我不知道我在问这个问题,但是您大大简化了我的线程管理设计过程。

4

2 回答 2

4

Runnable如果没有orCallable对象,您将无法做到这一点。做你想做的事情的正确方法是创建一个Runnable类,该类接受你的对象并在该对象上调用适当的方法。

public class MyRunnable implements Runnable {
    private MyObject obj;
    public MyRunnable(MyObject obj) {
       this.obj = obj;
    }
    public void run() {
       obj.someMethod();
    }
}

如果您需要调用几个方法之一,那么您可以enum为此使用 an。如果您需要传入参数,则可以将它们添加到构造函数中。

对于线程,始终建议您使用Executors类和ExecutorService线程池。这将限制递归算法创建的线程数量,并隐藏线程详细信息。

// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// or you can create an open-ended thread pool
// ExecutorService threadPool = Executors.newCachedThreadPool();
while (recursing) {
    threadPool.submit(new MyRunnable(myObject));
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
...
于 2012-11-14T01:38:25.103 回答
0

你可能需要这样的东西:

您的可运行文件:

public class ComputeNode implements Runnable {

    private Node node;

    public ComputeNode(Node nodeToCompute) {
        this.node = nodeToCompute;
    }

    @Override
    public void run() {
        computeOnNode(node);
    }
}

如何启动它:

Runnable compute = new ComputeNode(nodeToComputeOn);
Thread t = new Thread(comute);
t.start();

ComputeOnNode() 是你自己写在某处的方法。

于 2012-11-14T01:42:49.157 回答