Использование sleep () и interrupt () для повторного использования потока - PullRequest
5 голосов
/ 28 мая 2011

В приложении Swing я хотел бы повторно использовать порожденный поток вместо создания нового для обслуживания запросов. Это связано с тем, что запросы будут поступать через короткие промежутки времени, а стоимость создания нового потока для каждого запроса может быть высокой.

Я думаю об использовании методов interrupt () и sleep (), чтобы сделать это, как показано ниже, и хотел бы знать о любых потенциальных проблемах производительности с кодом:

public class MyUtils {
    private static TabSwitcherThread tabSwitcherThread = null;

    public static void handleStateChange(){
        if(tabSwitcherThread == null || !tabSwitcherThread.isAlive()){
            tabSwitcherThread = new TabSwitcherThread();
            tabSwitcherThread.start();
        }
        else
            tabSwitcherThread.interrupt();      
    }

    private static class TabSwitcherThread extends Thread{
        @Override
        public void run() {
           try {
                 //Serve request code

                 //Processing complete, sleep till next request is received (will be interrupted)
                 Thread.sleep(60000);
           } catch (InterruptedException e) {
                //Interrupted execute request
                run();
           }

           //No request received till sleep completed so let the thread die         
        }
   }
}

Спасибо

Ответы [ 2 ]

10 голосов
/ 28 мая 2011

Я бы не использовал sleep() и interrupt() - я бы использовал wait() и notify(), если бы мне было абсолютно необходимо.

Однако есть ли реальная необходимость сделать это вместо использования ThreadPoolExecutor, который может обработать повторное использование потока для вас? Или, может быть, использовать BlockingQueue в моде производителя / потребителя?

Java уже предоставляет достаточно высокоуровневых строительных блоков для этого, и вам не нужно переходить на этот уровень самостоятельно.

4 голосов
/ 28 мая 2011

Я думаю, что вы ищете ThreadPool. Java 5 и выше поставляется с ThreadPoolExecutor . Я бы посоветовал вам использовать то, что поставляется с Java, вместо того, чтобы писать свои собственные, чтобы вы могли сэкономить много времени и средств.

Конечно, если вам абсолютно необходимо сделать это так, как вы описали (эй, иногда деловые требования усложняют нашу жизнь), тогда используйте wait () и notify (), как предложил Джон. Я бы не использовал sleep () в этом случае, потому что вы должны указать указанное время ожидания, и вы никогда не будете знать, когда поступит следующий запрос. Наличие потока, который продолжает просыпаться, а затем возвращается в режим сна, кажется мне немного расточительным из цикла ЦП ,

Вот хороший учебник о ThreadPoolExecutor.

EDIT:

Вот пример кода:

public class MyUtils {
    private static UIUpdater worker = null;
    private static ExecutorService exeSrv = Executors.newFixedThreadPool(1);

    public static void handleStateChange(){
        if(tabSwitcherThread == null || !tabSwitcherThread.isAlive()){
            worker = new UIUpdater();
        }     

        //this call does not block 
        exeSrv.submit(worker, new Object());     
    }

    private static class UIUpdater implements Runnable{
        @Override
        public void run() {

           //do server request and update ui.
        }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...