4

私は、他のメソッドからの操作を ConcurrentLinkedQueue にキューに入れ、キューを処理する作成スレッドからのみ呼び出す必要がある process() メソッドを持つクラスを作成しています。これは、他のメソッドの操作を他のスレッドから呼び出すことができるためですが、実際のアクションは作成者スレッドでのみ実行する必要があります。これは、UI スレッドの外部で UI コードを実行するために使用する必要があるAndroid のrunOnUiThreadに似ています。

process メソッドについての私の考えは、最初に作成者スレッドがそれを呼び出していることをアサートし、次に単純にそれぞれをキューで実行することです。現在のスレッドを保存されている Thread 参照と比較する方法がわかりません。参照が同じであることが保証されているかどうかについてのドキュメントが見つかりません。equalsメソッドを使用する必要がありますか?==演算子を使用する必要がありますか?Thread オブジェクトを比較することはできますか? または、それらの名前やその他のデータを比較する必要がありますか?

関連するコードは次のようになります: (キューのロジックは示されていません)

public class MultiThreadTasker {
    private Thread creatorThread;

    public MultiThreadTasker() {
        creatorThread = Thread.currentThread();
    }

    public void process() {
        if(Thread.currentThread() != creatorThread) {
            throw new IllegalArgumentException("...");
        }
        // ...
    }

    // ...
}

これを行うための代替方法の推奨事項も歓迎します。Executor を再発明しているように見えますが、独自のスレッドを処理する代わりにタスクの実行を手動で開始できる Executor は見当たりませんでした。

4

2 に答える 2

1

現在のスレッドでのみタスクを実行したい場合、なぜキューを共有するのでしょうか? そのスレッドだけが表示/使用できる各スレッドにローカルなキューがあります。

これが私がすることです。

private static final ThreadLocal<Queue<Runnable>> QUEUE = new ThreadLocal<Queue<Runnable>>() {
    @Override
    protected Queue<Runnable> initialValue() {
        return new LinkedList<Runnable>(); 
    }
};

public static void runLater(Runnable runnable) {
    QUEUE.get().add(runnable);
}

public static void runAll() {
    for (Runnable runnable : QUEUE.get())
        runnable.run();
    QUEUE.get().clear();
}
于 2012-09-10T14:03:07.090 に答える
0

スレッドの比較が機能しない場合は、スレッド ローカル UUID ( http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html、http://docs.oracle. com/javase/1.5.0/docs/api/java/util/UUID.html ) を参照して呼び出し元を比較します。コンストラクターにスレッド ローカル フィールドを設定します。

于 2012-09-10T14:00:05.477 に答える