Различия между методами wait () и join () в Java

Опубликовано: 3 Декабря, 2021

The wait() and join() methods are used to pause the current thread. The wait() is used in with notify() and notifyAll() methods, but join() is used in Java to wait until one thread finishes its execution.
wait() is mainly used for shared resources, a thread notifies other waiting thread when a resource becomes free. On the other hand join() is used for waiting a thread to die.

Сходства между wait () и join ()

  • Оба метода wait () и join () используются для приостановки текущего потока в Java.
  • Оба метода wait () и join () могут быть прерваны вызовом метода interrupt () в Java.
  • Оба метода wait () и join () - нестатический.
  • И wait (), и join () перегружены в Java. wait () и join (), которые без тайм-аута, а также принимают параметр тайм-аута.

Разница между методом wait () и join ()

  • Наиболее очевидная разница, оба представлены разными пакетами, метод wait () объявлен в классе java.lang.Object, а join () объявлен в классе java.lang.Thread.
  • Wait () используется для межпотоковой связи, в то время как join () используется для добавления последовательности между несколькими потоками, один поток начинает выполнение после завершения выполнения первого потока.
  • Мы можем запустить ожидающий поток (перешел в это состояние, вызвав wait ()), используя методы notify () и notifyAll (), но мы не можем прервать ожидание, вызванное соединением, без прерывания или прерывания потока, на котором вызывается соединение, выполняется законченный.
  • Одно из наиболее важных различий между wait () и join (), то есть wait (), должно вызываться из синхронизированного контекста, то есть из синхронизированного блока или метода, иначе он вызовет исключение IllegalMonitorStateException, но, с другой стороны, мы можем вызвать метод join () с синхронизацией и без нее. контекст в Java.


    Пример соединения

    // Java program to explain the use of join()
    class A extends Thread {
    @Override
    public void run()
    {
    for ( int i = 1 ; i <= 4 ; i++) {
    try {
    Thread.sleep( 100 );
    }
    catch (Exception e) {
    System.out.println(e);
    }
    System.out.print(i + " " );
    }
    }
    }
    class B extends Thread {
    @Override
    public void run()
    {
    for ( char i = 'a' ; i <= 'd' ; i++) {
    try {
    Thread.sleep( 100 );
    }
    catch (Exception e) {
    System.out.println(e);
    }
    System.out.print(i + " " );
    }
    }
    }
    class GFG extends Thread {
    public static void main(String args[])
    {
    // creating two threads
    A a1 = new A();
    B b1 = new B();
    // starts second thread after when
    // first thread a1 is died.
    a1.start();
    try {
    a1.join();
    }
    catch (Exception e) {
    System.out.println(e);
    }
    // after thread a1 execution finished
    // then b1 thread start
    b1.start();
    }
    }

    Выход:

    1 2 3 4 abcd
    


    Пример ожидания

    // Java program to explain the
    // concept of Waiting a thread.
    class PNBCustomer {
    // let a initial amount is 9000
    int amount = 9000 ;
    // synchronized function because i wil use for
    // waiting thread. Here synchronized means inter-
    // thread communication
    synchronized withdraw( void int amount)
    {
    System.out.println( "withdrawing..." );
    // check if balance amount is less than withdraw
    // amount in this condition. deposit() synchronized
    // method call and deposit amount after that this
    // thread again execute
    if ( this .amount < amount) {
    System.out.println("Amount is not enough; waiting +
    " for deposit..." );
    try {
    wait();
    }
    catch (Exception e) {
    }
    }
    System.out.println( "after deposit, balance is available: " +
    this .amount);
    this .amount -= amount;
    System.out.println( "withdraw completed..." );
    System.out.println( "after Withdraw, balance is available: " +
    this .amount);
    }
    synchronized void deposit( int amount)
    {
    System.out.println( "going to deposit..." );
    this .amount += amount;
    System.out.println( "deposit completed... " );
    notify();
    }
    }
    public class Wait {
    public static void main(String args[])
    {
    final PNBCustomer c = new PNBCustomer();
    // create two new thread and start
    // them simultaneously
    new Thread() {
    @Override
    public void run()
    {
    c.withdraw( 15000 );
    }
    }.start();
    new Thread() {
    @Override
    public void run()
    {
    c.deposit( 10000 );
    }
    }.start();
    }
    }

    Выход:

    снятие ...
    Суммы не хватает; жду депозита ...
    собираюсь внести ...
    депозит завершен ... 
    после депозита доступен баланс: 19000
    снятие завершено ...
    после вывода доступен баланс: 4000
    

    Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .