2016-02-17 6 views
0

Я пытаюсь создать новую ветку в другом потоке. Я не могу остановить поток ни на что. Есть ли способ, по которому я могу выйти из строя после выполнения операций.Thread not stopping

package p.Threads; 

public class Thread2 { 

    private volatile boolean flag = false; 

    public Thread2(){ 
     Thread t2 = new Thread(){ 

      public void run(){ 
       System.out.println("t2 started :::::::::::::: "); 
       Thread2 t3 = new Thread2(); 
       try { 
        t3.start2ndThread(); 

       } catch (InterruptedException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       }     
      } 

     }; 
     t2.start(); 
     t2.interrupt(); 
    } 

    public void start2ndThread() throws InterruptedException{ 

     Runnable r3 = new Runnable() { 

      @Override 
      public void run() { 
       System.out.println("Thread t3 started >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); 
       try { 
        Thread.sleep(2000); 

       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 

     Thread t3 = new Thread(r3); 
     t3.start(); 
     t3.join(2000); 
     terminate();    
    } 

    public void terminate(){ 
     flag = true; 
    } 

    public static void main(String[] args) { 
     Thread2 thread2 = new Thread2();    
    } 
} 
+0

Короткий ответ, нет. Да. Но вам нужно будет проверить завершение в вашем 't3'' Thread' (и потому, что 'flag' не * эффективно *' final'), вы не можете сделать это напрямую. Вы можете использовать другой механизм 'flag' (возможно,' Singleton' или 'AtomicInteger'), но это не так прямолинейно, как вы, вероятно, надеялись. –

+0

Что вы пытаетесь достичь здесь. Если у вас есть реальный прецедент для потоков, рассмотрите возможность использования ExecutorService https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html для создания потоков и завершения работы исполнителя. – User2709

+1

Поскольку вы изначально отметили [java-ee], хотя вы использовали обычный класс Java-приложений с методом 'main()', я хотел бы предупредительно указать вам на то, что ручное создание и нереста 'Thread's is ** ужасно плохая идея ** в приложении Java EE. Это тогда пища для размышлений: http://stackoverflow.com/q/6149919 – BalusC

ответ

0

Вы прерываете поток t2, но уже породили поток t3.

Вам нужен блок catch, чтобы поймать InterruptedException для t2.

В catch, прерывание вызова на t3.