0

アイテムを追加、取得、または削除するために再帰的な方法を使用しようとしているツリー構造があります。イテレータで見つけたすべての子ノードに新しいスレッドを導入できるようにしたいと考えています。現在、ノードを呼び出すときにノードを再帰メソッドに渡します。スレッドを開始し、そのスレッドにそのメソッドを呼び出すように指示できるようにしたいと考えています。新しいスレッド、thread.callMethod() と言うのと同じようなことをするにはどうすればよいでしょうか? どうやらRunnableインターフェースとrunメソッドが必要ですか? ただし、これは必要以上に複雑なようです (メソッド名は既に持っています)。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またはCallableオブジェクトなしでは実行できません。Runnable必要なことを行う適切な方法は、オブジェクトを受け取り、そのオブジェクトで適切なメソッドを呼び出すクラスを作成することです。

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

いくつかのメソッドのいずれかを呼び出す必要がある場合は、 を使用できますenum。引数を渡す必要がある場合は、それらをコンストラクターに追加できます。

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 に答える