【问题标题】:Regarding daemon thread providing some service to non daemon thread关于守护线程为非守护线程提供一些服务
【发布时间】:2012-07-24 19:53:46
【问题描述】:

我有一个查询是我在下面开发了一个名为线程一和线程二的多个线程的代码,下面是代码..

类 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();

    }

}

现在我希望将线程二设置为守护线程,它应该为线程一提供一些服务,它可以是任何类型的服务,但最后我想要实现的是守护线程为非守护线程提供一些服务.请告知如何实现这一点。问题是守护线程如何为非守护线程提供服务..?

【问题讨论】:

  • 请大家多多指教。
  • Ummm t2.setDaemon(true); 我错过了什么吗?
  • 问题是守护线程如何为非守护线程提供服务

标签: java multithreading threadpool


【解决方案1】:

问题是守护线程如何为非守护线程提供服务

我会使用执行器服务。如果要从守护线程返回值,可以使用Callable&lt;ReturnType&gt; 而不是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.

首先它创建一个带有工作队列的线程池。线程池有一个创建线程的因素,在这种情况下,它具有一个给定的名称,它是一个守护进程。

其次,有一个循环将 10 个任务添加到队列中以供执行者线程执行。

最后它会在服务完成后停止服务(这很少需要)

【讨论】:

  • @assylias 有时,真正的问题并不是很明显。 ;)
  • @peter 很棒的人,请您在我正在通过执行器服务时完整发布更新的代码,提前谢谢。
  • @peter 您能否解释一下您发布的上述代码发生了什么,因为我已经部分理解了
  • 好的,添加说明。如果您有具体问题,请告诉我。
  • @Peter 但它为非守护线程提供什么服务,这是在代码中..!!
【解决方案2】:

例如让t1 成为守护进程:

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

注意:

  • setDaemon需要在线程启动前调用
  • t1.currentThread().setName("one"); 肯定不会做你想做的事。它将主线程的名称设置为“one”,而不是 t1 的名称。请参阅我上面的代码,了解您可能的意思。
  • 这些信息可以在javadoc of Thread 中轻松找到,这应该是您搜索此类信息时首先看到的地方。

【讨论】:

  • 问题是守护线程如何为非守护线程提供服务。
  • @user1538526 守护线程只是一个线程 - 唯一的区别是 JVM 不会等到守护线程在退出时完成。因此,您可以让守护线程执行任务,就像让非守护线程运行相同的任务一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多