2012-07-26 112 views
0

我有一個我已經開發了以下多個線程的代碼命名的一個線程和線程二,下面是一個代碼查詢..關於守護線程提供非守護線程一些服務

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

    } 

} 

現在我想線程兩個來設置爲守護線程,它應該提供一些服務線程一個它可以是任何類型的服務,但最後我是想實現的是守護線程提供某些服務到非守護線程。請告知如何實現這個。問題是關於守護進程線程如何將服務提供給非守護線程..?

+0

夥計請告知這一點。 – user1538526 2012-07-26 09:08:36

+0

Ummm't2.setDaemon(true);'我錯過了什麼? – 2012-07-26 09:24:41

+0

問題是關於守護進程線程如何向非守護進程線程提供服務 – user1538526 2012-07-26 09:37:25

回答

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個任務添加到執行器線程的隊列中以執行。

最後,它停止服務時,它已完成(這是很少需要的)

+0

+1用於回答問題;-) – assylias 2012-07-26 09:42:49

+0

@assylias有時*真正的問題*並不是立即顯而易見的。 ;) – 2012-07-26 09:45:49

+0

@peter真棒的人,請你提前完整地發佈更新後的代碼,因爲我正在通過執行器服務。 – user1538526 2012-07-26 09:49:48

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中找到,這應該是您搜索該類信息時首先查看的地方。
+0

問題是關於守護進程線程如何將服務提供給非守護進程線程。 – user1538526 2012-07-26 09:36:42

+0

@ user1538526守護線程只是一個線程 - 唯一的區別是JVM不會等到守護線程退出時才結束。所以你可以有一個守護線程執行任務,就像你有一個非守護線程執行相同的任務一樣。 – assylias 2012-07-26 09:41:32