Применение методов isAlive() и join() Java

Применение методов isAlive() и join() Java

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

Но это неудовлетворительное реше­ние, вызывающее следующий серьезный вопрос: откуда одному потоку исполне­ния известно, что другой поток завершился? Правда, в классе Thread предостав­ляется средство, позволяющее разрешить этот вопрос.

Определить, был ли поток исполнения завершен, можно двумя способами. Во­ первых, для этого потока можно вызвать метод isAlive(), определенный в классе Thread. Ниже приведена общая форма этого метода:

final Boolean isAlive()

Метод isAlive() возвращает логическое значение true, если поток, для кото­рого он вызван, еще исполняется. В противном случае он возвращает логическое значение false.

И во-вторых, в классе Thread имеется метод join(), который применяется чаще, чем метод isAlive(), чтобы дождаться завершения потока исполнения.

Ниже приведена общая форма этого метода:

final void join() throws InetrruptedException

Этот метод ожидает завершения того потока исполнения, для которого он вы­зван. Его имя отражает следующий принцип: вызывающий поток ожидает, когда указанный поток присоединится к нему.

Дополнительные формы метода jоin() по­зволяют указывать максимальный промежуток времени , в течение которого тре­буется ожидать завершения указанного потока исполнения.

Ниже приведена усовершенствованная версия программы из предыдущего примера, где с помощью метода join() гарантируется, что главный поток завер­шится последним. В данном примере демонстрируется также применение метода isAlive().

//   join(),     
class NewThread implements Runnable {
    
    String name; //   
    Thread t;
    
    NewThread(String threadname) {
        
        name = threadname;
        t = new Thread(this, name);
        System.out.println(" : " + t);
        t.start(); //   
        
    }
    
    //     
    public void run() {
        
        try {
            
            for(int i = 5; i > 0; i--) {
                System.out.println(name + ": " + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println(name + " .");
        }
        System.out.println(name + " .");
            
    }
        
}

class DemoJoin {
    
    public static void main(String args[]) {
        
        NewThread obj1 = new NewThread("");
        NewThread obj2 = new NewThread("");
        NewThread obj3 = new NewThread("");
        
        System.out.println("  : " + obj1.t.isAlive());
        System.out.println("  : " + obj2.t.isAlive());
        System.out.println("  : " + obj3.t.isAlive());
        
        //    
        
        try {
            
            System.out.println("  .");
            obj1.t.join();
            obj2.t.join();
            obj3.t.join();
            
        } catch ( InterruptedException e ) {
            System.out.println("  ");
        }
        System.out.println("  : " + obj1.t.isAlive());
        System.out.println("  : " + obj2.t.isAlive());
        System.out.println("  : " + obj3.t.isAlive());
        
        System.out.println("  ");
        
    }
    
}

Ниже приведен результат, в ы водимый данной программой ( у вас он может ока­заться иным в зависимости от конкретной исполняющей среды ).

 : Thread[,5,main]
 : Thread[,5,main]
: 5
 : Thread[,5,main]
: 5
  : true
  : true
  : true
  .
: 5
: 4
: 4
: 4
: 3
: 3
: 3
: 2
: 2
: 2
: 1
: 1
: 1
 .
 .
 .
  : false
  : false
  : false
  

Как видите, потоки прекращают исполнение после того, как вызовы метода join() возвращают управление.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *