0

スレッド1とスレッド2という名前の複数のスレッドのコードを以下に開発したというクエリが1つあります。以下は、コードです。

クラスmultipはRunnable{を実装します

public void run() {
    for (int i = 0; i < 20; i++) {
        try {


        Thread.sleep(500);
                System.out.println(Thread.currentThread().getName());
                System.out.println("i");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

public class MultiThread3 {
    public static void main(String... a) {
        multip obj = new multip();
        Thread t1 = new Thread(obj);
        t1.currentThread().setName("one");
        t1.start();
        Thread t2 = new Thread(obj);
        t2.currentThread().setName("two");
        t2.start();

    }

}

ここで、スレッド2をデーモンスレッドとして設定し、スレッド1に何らかのサービスを提供する必要があります。これは、どのような種類のサービスでもかまいませんが、最終的に達成しようとしたのは、デーモンスレッドが非デーモンスレッドにサービスを提供することです。これを実現する方法を教えてください。問題は、デーモンスレッドが非デーモンスレッドにサービスを提供する方法についてです。

4

2 に答える 2

1

問題は、デーモンスレッドが非デーモンスレッドにサービスを提供する方法についてです

エグゼキューターサービスを使用します。デーモン スレッドから値を返したい場合は、 のCallable<ReturnType>代わりに を使用できますRunnable

// creating a thread pool.
ExecutorService service = Executors.newSingleThreadExecutor(new ThreadFactory() {
    @Override
    public Thread newThread(Runnable r) {
        // creating a thread.
        Thread two = new Thread(r, "two");
        // making it a daemon thread.
        two.setDaemon(true);
        return two;
    }
});

for(int i=0;i<10;i++)
    // creating a task and submitting it.
    service.submit(new Runnable() {
        @Override
        public void run() {
            System.out.println("["+Thread.currentThread().getName()+"] - Hello World.");
            Thread.yield();
        }
    });
service.shutdown();

版画

[two] - Hello World.
[two] - Hello World.
[two] - Hello World.

まず、ワーク キューを使用してスレッド プールを作成します。スレッドプールには、スレッドを作成する要素があります。この場合、デーモンである特定の名前を使用します。

次に、executors スレッドが実行するキューに 10 個のタスクを追加するループがあります。

最後に、サービスが終了するとサービスを停止します (これが必要になることはめったにありません)。

于 2012-07-26T09:40:08.967 に答える
1

t1たとえば、デーモンを作成するには:

Thread t1 = new Thread(obj);
t1.setName("one");
t1.setDaemon(true);
t1.start();

ノート:

  • setDaemonスレッドが開始される前に呼び出す必要があります
  • t1.currentThread().setName("one");ほとんどの場合、あなたが望むことはしません。t1 の名前ではなく、メイン スレッドの名前を「one」に設定します。おそらくあなたが何を意味したかについては、上記の私のコードを参照してください。
  • この情報は、スレッドの javadoc で簡単に見つけることができます。そのような情報を検索するときに最初に確認する場所です。
于 2012-07-26T09:11:35.310 に答える