2016-02-19 1 views
0

У меня есть основной поток с методом «start». Этот метод запускает другой поток, который выполняет долгую работу. Метод «start» может быть вызван из других потоков. Как избежать создания новых потоков в методе «запуска», если у вас уже есть один и не блокировать основной поток? Я пытаюсь использовать singleThreadExecutor, но он ставит задачи в очередь.java: не начинайте новую нить при текущем состоянии

код: Метод Начало:

public void start(){ 
// need only one active thread 
// if thread alive, avoid to start another 
     t = new Thread(new Runnable() { 
      public void run() { 
       try { 
        Thread.currentThread().sleep(3000);  
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     t.start();  
    } 

Простой тест

for (int i = 0; i < 100; i++) { 
      Thread r = new Thread(new Runnable() { 
       public void run() { 
        Helper.getInstance().start(); 
       } 
      }); 
      r.start();  
    }  
+0

Использовать пул потоков размером 1 –

+0

Итак, вы хотите поставить в очередь второе задание, если поток уже запущен, или просто игнорировать его? – Thilo

+1

SingleThreadExecutor не ставит в очередь потоки. Он ставит задачи (однако в вашем случае вы, вероятно, ошибочно сделали свои задачи в потоки). – Kayaman

ответ

0

Если вы хотите просто выбросить новые задачи, когда текущий поток занят, вы можете использовать SingleThreadExecutor и настроить его discard any overflow tasks вместо очереди в очереди.

Смежные вопросы