8

ご存知のように を呼び出したThread後、クラス内の関数が呼び出されます。関数では、クライアントから「さようなら」メッセージを受け取る限り、スレッドを維持したいと考えています。それらをwhileループに入れると、大量のメモリが必要になると思いますが、スレッドの力を使用していません。ちなみに、実行関数でスレッドをスリープさせたくないのですが、実行関数でそこにとどまる他の方法はありますか?start()run()Runnablerun()Thread.sleep(6000);

  1. 答えが、どこで、どのように参加し、それを使用する場合? run 関数の最初にポップする必要があり、クライアントから「さようなら」を送信するまでそこにとどまりますか?

  2. 私は言うべきwhile((request=in.readLine())!=null){ですか?クライアントとの接続が失われると思うか、クライアントとの接続が失われると思うので、うまくいきませんでしたか?

  3. 少し危険なwhile(Thread.isAlive)呼び出しで「バイ」を受け取ったときに、脅威を言ってから殺す必要がありますか?Thread.stop

ここに私の単純化されたコードがあります:

while(true)
        {   
            ClientWorker w;
            try
            {                   
                w = new ClientWorker(serverSocket.accept());
                    Thread t = new Thread(w);
                    t.start();
                }
......  }

    class ClientWorker implements Runnable {
        public ClientWorker(Socket incoming)
        {
            myList = my;
            this.incoming = incoming;
        }
    public synchronized  void run()
    {
         in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
.
.
..
...
}
4

3 に答える 3

10

最も単純なケースでは、次のように、run メソッドにその作業を実行させ、必要に応じて終了させるだけです。

public void run() {
    boolean running = true;
    while(running) {
        running = doWork();
        if (Thread.interrupted()) {
            return;
        }
    }
}

ここでは、doWork() メソッドが false を返すとプロセスが停止します。特に長時間実行する必要がある場合は、スレッドを中断できるようにすることも良いスタイルです。このチュートリアルを参照してください。これが機能するには、 doWork() が定期的に返される必要があります。run メソッドが返されると、スレッドはシステムによって再利用されるため、スレッドを再開できないことに注意してください。

スレッドをさらに制御する必要がある場合は、個別の Worker クラスと ThreadManager クラスを作成できます。

ThreadManager が Worker を終了できるようにするには、定期的にチェックされる揮発性ブール値フィールドを Worker に作成します。

public class Worker extends Thread {

    private volatile boolean running;

    public void run() {
        running = true;
        while(running) {
            running = doWork();
            if (Thread.interrupted()) {
                return;
            }
        }
    }

    public void stopRunning() {
        running = false;
    }
}

Worker は、作業が中断されるか、作業が完了すると終了します。また、ThreadManager は、stopRunning() メソッドを呼び出してワーカーに停止を要求できます。

スレッドが機能しなくなった場合、ThreadManager で wait() メソッドを呼び出すこともできます。これにより、新しい作業があることが通知されるまでスレッドが一時停止します。ThreadManager は、新しい作業が到着したときに notify() または notifyAll() を呼び出す必要があります (この例では、ThreadManager がモニターとして使用されています)。

このアプローチを使用すると、Worker をシンプルに保ち、作業の実行のみに関心を持つことができます。ThreadManager は、スレッドの数を決定し、作業を利用できるようにしますが、実際の作業の詳細を知る必要はありません。さらにもう 1 つのステップとして、'work' を別のクラスに分割することもできます。これを Job と呼ぶことができます。この例は、私のwebcrawler exampleにあります。これは、ThreadManager からワーカー スレッドに新しい作業を渡すのに役立ちます。

編集: 明確化: スレッドが何も動作せず、何らかの条件を待機する必要がある場合は、反復を使用して待機するのではなく、待機/通知 (私が提供した webcrawler の例を参照) または単純なコールバックを使用します。状態が発生します。

于 2012-10-17T14:53:19.277 に答える
2

ちょうどあなたが得るときreturnからrun()"bye"

于 2012-10-17T13:27:55.237 に答える