2009-10-04 45 views
11

我有一個MyThread對象,當我的應用程序通過服務器加載時實例化,我將其標記爲守護程序線程,然後調用start()。只要應用程序處於活動狀態,線程就會等待來自隊列的信息。 我的問題是這樣的:目前MyThread正在擴展Thread,因爲我將它標記爲守護進程,並且閱讀了如何更易於實現Runnable並使用Executors。所以我想問的是,如果MyThread將實現Runnable而不是擴展Thread(當然將被重命名),我將使用newSingleThreadScheduledExecutor()如何,什麼或者在哪裏標記爲Daemon。 我希望我沒有弄得一團糟,請原諒我,因爲多線程環境的某些部分對我來說是非常新的。Java中的執行程序和守護進程

感謝 以太

更新: 我指的是在我的應用程序的模塊是一個網絡應用程序,它有幾個線程實際上這種和他們做了什麼的共同點是,他們都在由於各種原因,ServletContext作爲成員。目前,我將Thread擴展爲WebThread,其中ServletContext作爲memebr,所有子類都可以使用它。如果我切換到與執行者了Runnable範式和的ThreadFactory比基本上我需要的WebRunnable它實現Runnable並具有ServletContext作爲公衆成員的醜陋混合動力車和具有除了newThread(Runnable arg0)ThreadFactory實施newThread(WebRunnable arg0)。 我不知道什麼是最好的。 謝謝

回答

12

如果您使用的是計劃執行器,您可以提供ThreadFactory。這用於創建新的線程,並且可以根據需要修改這些線程(例如,使其成爲守護進程)。

編輯:要回答你的更新,你ThreadFactory只需要實現newThread(Runnable r)因爲你WebRunnableRunnable。所以沒有真正的額外工作。

+0

爲了技術的正確性 - 但在這種情況下使用Executor有沒有什麼優勢?對我來說似乎有點「爲複雜而複雜」(但也許我錯了......) – hjhill

+0

也許不是。但是我寫了一個系統,在這之前使用單線程執行程序開始,並在稍後階段插入不同的執行程序。 –

+0

@布賴恩 - 我有點在想希爾希爾在想什麼。我有一個這樣的線程,我不知道是否值得使用ThreadFactory – Ittai

23

退房的JavaDoc爲newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

這將實現這樣的事:

public class MyClass { 
    private DaemonThreadFactory dtf = new DaemonThreadFactory(); 
    private ScheduledExecutorService executor = 
           Executors.newSingleThreadScheduledExecutor(dtf); 
    // ....class stuff..... 
    // ....Instance the runnable..... 
    // ....submit() to executor.... 
} 

class DaemonThreadFactory implements ThreadFactory { 
    public Thread newThread(Runnable r) { 
     Thread thread = new Thread(r); 
     thread.setDaemon(true); 
     return thread; 
    } 
} 
+0

嗨Stu,首先感謝您的詳細解答,但我不確定您是否看到我的更新?我更新了這個問題,事實上我需要我的'Threads/Runnables'在執行運行時擁有一個'ServletContext'對象,我想知道如何通過Runnable來實現這一點。我知道,通過繼承'Thread',將它插入到'ThreadFactory'中是沒問題的,但我不確定Runnable範例是否可行或如何實現。 – Ittai

+0

啊,不,我沒有:P *(我開了你的問題回答,但花了我的時間去了。)*讓我想一點,並檢查出其他答案... –

+0

我決定做(可以改變)是有一個'singleton'類,它有一個'commonResourcesMap',它將是'',它將作爲servlet和非servlet的公共資源。這樣我就可以毫無問題地實現'Runnable'。 – Ittai

2

只是爲了與完整的另一個可能的解決方案的補充。雖然這可能不是很好。

final Executor executor = Executors.newSingleThreadExecutor(); 
Runtime.getRuntime().addShutdownHook(new Thread() { 

    @Override 
    public void run() { 
     executor.shutdownNow(); 
    } 
});