关于为非守护程序线程提供一些服务的守护程序线程

时间:2012-07-26 08:55:21

标签: java multithreading threadpool

我有一个查询,我已经开发了一个名为thread one和thread two的多个线程的代码,下面是代码..

类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 个答案:

答案 0 :(得分:1)

t1守护进程为例:

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

注意:

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

答案 1 :(得分: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.

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

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

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