1

私は現在マルチスレッド プログラミングを勉強していますが、スレッド間の共有リソースをマスターするのに苦労しています。

2 つの共有リソースがtimeあり、alarm

time私には 3 つのスレッドがあり、1 つは毎秒更新し続け、もう 1 つは監視timealarm、最後に 1 つはユーザーの要求に応じて変更しますtimealarm

これは、相互排除セマフォを使用して行われます。以下に説明する簡単なセットアップがあります。

  1. Mainスレッド、プログラムはここから始まり、ホストtimealarm共通変数をホストし、サブスレッドをインスタンス化します。
  2. Tickサブスレッド、1000ms ごとにスリープし、Motherスレッドのtime変数を変更します
  3. UserInputサブスレッド、ユーザー入力がキャッチされるまでブロックされ、スレッド内またはいずれtimeかを変更します。alarmMain
  4. Alarmサブスレッド、1000ms ごとにスリープ、alarm==の場合にオフtime

スレッドは各リソースのMainミューテックスを保持するため、一度に 1 つのスレッドしかアクセスできません。

そのような設計は合理的ですか、それとも物事を複雑にしすぎているだけですか?

4

2 に答える 2

2

私の最初のコメントは、あなたが使用している言語に関するものです。これは、あなたの一部に誤解があることを示している可能性があります. スレッドは変数を所有していません。これは、 のいくつかのカスタム サブクラスを宣言したことを意味する場合がありますThread。その場合、これは推奨される方法ではありません。Threadは単なるクラスの名前であり、実際のスレッドではないことに注意してくださいFile。ファイルではないのとまったく同じです。あなたはコードを投稿していないので、当て推量に頼らなければなりませんが、私が説明したことが本当なら、再設計する必要があります. プレーンなクラス (何もサブクラス化しない) を使用し、. でインスタンス化ThreadしますRunnable

第 2 に、「ミューテックス」は Java 言語仕様で定義された用語ではないため、「ミューテックス」が何を意味するのかが明確ではありません。java.util.concurrentなどのパッケージの何かを意味する場合Semaphore、これはやり過ぎです。Objectロックとして使用する単純な Java インスタンスを意味する場合、それは単純で直接的なアプローチになります。ただし、実際にはロックはまったく必要ないことに注意してください。2 つのタイムスタンプ値にvolatileは変数、または多くても s (または使用する任意の型) で十分であるAtomicLongため、それらをアトミックに更新できます。

于 2012-10-13T17:51:00.310 に答える
1

単純にScheduledExecutorServiceを使用できると思います

以下は、1 時間 10 秒ごとにビープ音を鳴らすように ScheduledExecutorService を設定するメソッドを含むクラスです。

import static java.util.concurrent.TimeUnit.*;
class BeeperControl {
private final ScheduledExecutorService scheduler = 
   Executors.newScheduledThreadPool(1);

public void beepForAnHour() {
    final Runnable beeper = new Runnable() {
            public void run() { System.out.println("beep"); }
        };
    final ScheduledFuture<?> beeperHandle = 
        scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
    scheduler.schedule(new Runnable() {
            public void run() { beeperHandle.cancel(true); }
        }, 60 * 60, SECONDS);
   }
}
于 2012-10-13T17:00:39.230 に答える