2014-06-17 1 views
1

Пока я тестирую свой код в Eclipse, я остановил программу в консоли, но обнаружил, что потоки продолжают работать. Я пытаюсь создать конвейер для прецессии для наших постоянно входящих данных. Как я могу остановить все текущие потоки, когда останавливаю программу?Что произойдет с ExecutorService, если я остановлю запущенный проект java

(Особенно, когда я использую бесконечный цикл)

Вот моя главная:

public static void main(String[] args) { 

    queue = new ArrayBlockingQueue<StreamQueueItem>(100);  

    LogFileProcessor threadFileProcessor = new LogFileProcessor(queue); 
    new Thread(threadFileProcessor).start(); 

    StreamCoordinator threadStreamCoordinator = new StreamCoordinator(queue); 
    new Thread(threadStreamCoordinator).start(); 

} 

В основном первая нить держит Ставить на BlockingQueue, а вторая тема держит предметы выскочить из очереди и выберите отправителя запроса для отправки запроса.

Код StreamCoordinator:

public StreamCoordinator(BlockingQueue<StreamQueueItem> mQueue) { 
    super(); 
    this.mQueue = mQueue; 
    this.mThreadPool = Executors.newFixedThreadPool(ConfigConstants.SENDER_THREDPOOL_SIZE); 
    mBqHelper = new BigqueryHelper(ConfigConstants.PROJECT_ID,ConfigConstants.DATA_SET, ConfigConstants.TABLE_EXISTS); 
} 

@Override 
public void run() { 
    StreamQueueItem item = null; 

    while(true){ 
     //wait 1 second for next request 
     try { 
      Thread.sleep(1 * 1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     item = mQueue.poll(); 
     if(item != null){ 
      mThreadPool.execute(new RequestSender(mBqHelper,item)); 
     } 
    } 

} 

RequestSender:

@Override 
public void run() { 
    System.out.format("%d is sending request %s . List size: %d %s\n",mSenderId,FormatHelper.currentDate(),mRequestItem.getRowList().size(),mRequestItem.getLogReason().getTableName()); 
    mBqHelper.submitStreamRequest(mRequestItem.getLogReason().getTableName(), mRequestItem.getRowList()); 
    System.out.println("# " + mSenderId + " done. " + FormatHelper.currentDate()); 
} 
+0

«остановить проект Java»? Это нуждается в некоторых разъяснениях. – marekful

+1

Если вы убили JVM, потоки все еще не работают. –

+0

Я просто нажал на стоп в консоли Eclipse. Май JVM не убит, потому что Eclipse все еще открыт – foxwendy

ответ

0

Это зло код:

} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

Если вы ловите InterruptedException, вы должны обрабатывать его правильно , Регистрация и игнорирование этого приведет к неправильной работе вашей программы. Это исключение - это время выполнения, если сообщать вашему потоку, что он должен остановиться (т. Е. Вы нажали красную кнопку).

Попробуйте реагировать соответствующим образом на исключение:

} catch (InterruptedException e) { 
    return; 
} 

Это отличная статья на эту тему, стоит прочитать: Java theory and practice: Dealing with InterruptedException

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

  • Нет связанных вопросов^_^