2016-07-19 2 views
1

У меня есть Thread (реализует Runnable) от многих офицеров филиала, которые называют этот поток с их кодом ветвления. Я создал имя своего потока с кодом ветвления. Проблемы ...Запуск много потоков и стоп-потоков в Exception

  1. Когда в потоке потока возникло исключение - я не могу этого прекратить. И при попытке создать другой поток с любым именем «ExceptionInInitializerError» или «OutOfMemoryError: Java heap space» приходит
  2. Исключено исключение «OutOfMemoryError: Java heap space» При одновременном запуске 2 или более потоков.
public MyRunnerClass { 

    //This method called from many branch with their branch Code 
    public void executeBranchProcess(String branchCode){ 
     Thread t = new Thread(new Exporter(branchCode); 
     t.setName(branchCode); 
     t.start(); 
    } 
} 

Класс Thread здесь

public class Exporter implements Runnable{ 
    private String branchCode; 

    public Exporter(String branchCode){ 
     this.branchCode = branchCode; 
    } 

    @Override 
    public void run() { 
     try { 
      exportCorner(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void exportCorner() throws InterruptedException{ 
     try{ 
      //Some Process 
     }catch(Exception e){ 
      // I want to close running thread here 
      // I am using closeThread(this.branchCode), but not working 
     } 
    } 


    static void closeThread(String branchCode) throws InterruptedException { 
     Thread thread = null; 
     for (Thread t : Thread.getAllStackTraces().keySet()) { 
      if (t.getName().equals(branchCode)) 
       thread = t; 
     } 
     if (thread != null) { 
      thread.interrupt(); 
      thread.join(); 
     } 
    } 
} 
+2

Я понятия не имею, что вы просите. Если исключение встречается в методе запуска потока, то оно просто умирает (если только не выполняется какой-то бесконечный цикл, который просто ест исключения вместо того, чтобы реагировать на них). Другими словами: если ваш поток запускает исключение, просто убедитесь, что ваш код «возвращается» из этого метода (например, после регистрации исключения), и вы должны быть хорошими. – GhostCat

+0

Возможный дубликат [Как остановить поток, созданный при реализации runnable interface?] (Http://stackoverflow.com/questions/10630737/how-to-stop-a-thread-created-by-implementing-runnable-interface) –

+2

Используйте «ExecutorService» и отмените «Будущее», которое возвращается, когда вы отправляете ему задание. Кроме того, вы можете использовать 'Callable' вместо' Runnable', метод 'call()' позволяет вам исключать проверенные исключения, а не обрабатывать их явно. –

ответ

1

Вы сталкиваются с многочисленными проблемами здесь:

  1. Вы не можете присоединиться нить сама по себе. Thread.join() ждет, пока нить не погибнет. Но если вы вызываете это из потока, который хотите остановить, он просто ждет навсегда.

  2. Чтобы остановить поток, вам просто нужно вернуть его метод run(). В вашем случае просто добавьте return в предложение catch вместо того, чтобы звонить closeThread().

  3. Кажется, что у вас есть проблемы с памятью. Либо все, что вы делаете в exportCorner(), использует много памяти, или вы создаете сразу много потоков. Как упомянул Энди Тернер в комментариях, было бы полезно использовать ExecutorService для обработки ваших Runnable. Это может помочь вам управлять потоками и обеспечить ограниченное количество потоков.

+0

Спасибо за хорошее предложение. –

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