Рубрики

Параллелизм Java — методы yield (), sleep () и join ()

Мы можем предотвратить выполнение потока, используя один из следующих методов класса Thread.

  1. yield (): предположим, что есть три потока t1, t2 и t3. Поток t1 получает процессор и начинает его выполнение, а потоки t2 и t3 находятся в состоянии Ready / Runnable. Время завершения для потока t1 составляет 5 часов, а время завершения для t2 составляет 5 минут. Поскольку t1 завершит свое выполнение через 5 часов, t2 должен ждать 5 часов, чтобы просто завершить 5-минутную работу. В таких сценариях, когда одному потоку требуется слишком много времени для завершения своего выполнения, нам нужен способ предотвратить выполнение промежуточного потока, если ожидается что-то важное. yeild () помогает нам в этом.
    yield () в основном означает, что поток не выполняет ничего особенно важного, и если необходимо запустить какие-либо другие потоки или процессы, они должны выполняться. В противном случае текущий поток продолжит работу.

    Использование метода доходности:

    • Всякий раз, когда поток вызывает метод java.lang.Thread.yield, он дает подсказку планировщику потока, что он готов приостановить выполнение. Планировщик потоков может игнорировать эту подсказку.
    • Если какой-либо поток выполняет метод yield, планировщик потока проверяет, существует ли какой-либо поток с таким же или высоким приоритетом, чем у этого потока. Если процессор обнаружит какой-либо поток с более высоким или одинаковым приоритетом, он переместит текущий поток в состояние готовности / выполнения и передаст процессор другому потоку, а если нет — текущий поток продолжит работу.

    Синтаксис:

    public static native void yield()

    // Java-программа для иллюстрации метода yield ()
    // в Java

    import java.lang.*;

      
    // Расширение MyThread

    class MyThread extends Thread

    {

        public void run()

        {

            for (int i=0; i<5 ; i++)

                System.out.println(Thread.currentThread().getName()

                                    + " in control");

        }

    }

      
    // Класс водителя

    public class yieldDemo

    {

        public static void main(String[]args)

        {

            MyThread t = new MyThread();

            t.start();

      

            for (int i=0; i<5; i++)

            {

                // Управление передается дочернему потоку

                Thread.yield();

      

                // После выполнения дочернего потока

                // основной поток вступает во владение

                System.out.println(Thread.currentThread().getName()

                                    + " in control");

            }

        }

    }

    Выход:

    Thread-0 in control
    Thread-0 in control
    Thread-0 in control
    Thread-0 in control
    Thread-0 in control
    main in control
    main in control
    main in control
    main in control
    main in control
    

    Вывод может быть разным на разных машинах, но шансы на выполнение потока yield () в первую очередь выше, чем на другом потоке, поскольку основной поток всегда приостанавливает выполнение и дает шанс дочернему потоку (с тем же приоритетом).

    Замечания:

    • После того как поток выполнил метод yield и существует много потоков с одинаковым приоритетом, ожидающих процессора, мы не можем указать, какой поток получит шанс выполнения первым.
    • Поток, который выполняет метод yield, войдет в состояние Runnable из состояния Running.
    • Как только поток приостанавливает выполнение, мы не можем указать, когда он снова получит шанс, это зависит от планировщика потока.
    • Базовая платформа должна обеспечивать поддержку упреждающего планирования, если мы используем метод yield.
  2. sleep (): Этот метод заставляет текущий выполняющийся поток находиться в спящем режиме в течение указанного количества миллисекунд, в зависимости от точности и точности системных таймеров и планировщиков.
    Синтаксис:
    //  sleep for the specified number of milliseconds
    public static void sleep(long millis) throws InterruptedException
    
    //sleep for the specified number of milliseconds plus nano seconds
    public static void sleep(long millis, int nanos) 
                             throws InterruptedException

    // Java-программа для иллюстрации
    // метод sleep () в Java

    import java.lang.*;

      

    public class SleepDemo implements Runnable

    {

        Thread t;

        public void run()

        {

            for (int i = 0; i < 4; i++)

            {

                System.out.println(Thread.currentThread().getName()

                                                       + "  " + i);

                try

                {

                    // поток для сна в течение 1000 миллисекунд

                    Thread.sleep(1000);

                }

      

                catch (Exception e)

                {

                    System.out.println(e);

                }

            }

        }

      

        public static void main(String[] args) throws Exception

        {

            Thread t = new Thread(new SleepDemo());

      

            // вызов функции run ()

            t.start();

      

            Thread t2 = new Thread(new SleepDemo());

      

            // вызов функции run ()

            t2.start();

        }

    }

    Выход:

    Thread-0  0
    Thread-1  0
    Thread-0  1
    Thread-1  1
    Thread-0  2
    Thread-1  2
    Thread-0  3
    Thread-1  3
    

    Замечания:

    • Основываясь на требовании, мы можем сделать поток находящимся в спящем состоянии в течение определенного периода времени.
    • Sleep () заставляет поток определенно прекратить выполнение в течение заданного промежутка времени; если никакой другой поток или процесс не требуется запускать, процессор будет простаивать (и, вероятно, перейдет в режим энергосбережения).
  3. yield () против сна ()

    yield :() указывает на то, что поток не выполняет ничего особенно важного, и, если нужно запустить какие-либо другие потоки или процессы, они могут это сделать. В противном случае текущий поток продолжит работу.

    sleep () : заставляет поток определенно прекратить выполнение в течение заданного промежутка времени; если никакой другой поток или процесс не требуется запускать, процессор будет простаивать (и, вероятно, перейдет в режим энергосбережения).

  4. join (): метод join () экземпляра Thread используется для присоединения начала выполнения потока к концу выполнения другого потока, так что поток не запускается, пока не закончится другой поток. Если join () вызывается для экземпляра Thread, текущий запущенный поток будет блокироваться до тех пор, пока экземпляр Thread не завершит выполнение.
    Метод join () ожидает максимум этого миллисекунды, чтобы этот поток умер. Тайм-аут 0 означает ждать вечно
    Синтаксис:
    // waits for this thread to die.
    public final void join() throws InterruptedException
    
    // waits at most this much milliseconds for this thread to die
    public final void join(long millis) 
                  throws InterruptedException
    
    // waits at most milliseconds plus nanoseconds for this thread to die.
    The java.lang.Thread.join(long millis, int nanos)

    // Java-программа для иллюстрации метода join () в Java

    import java.lang.*;

      

    public class JoinDemo implements Runnable

    {

        public void run()

        {

            Thread t = Thread.currentThread();

            System.out.println("Current thread: "

                                   + t.getName());

      

            // проверяет, жив ли текущий поток

            System.out.println("Is Alive? "

                                   + t.isAlive());

        }

      

        public static void main(String args[]) throws Exception

        {

            Thread t = new Thread(new JoinDemo());

            t.start();

      

            // Ожидает 1000мс этой нити, чтобы умереть.

            t.join(1000);

      

            System.out.println("\nJoining after 1000"+

                                 " mili seconds: \n");

            System.out.println("Current thread: " +

                                        t.getName());

      

      

            // Проверяет, жив ли этот поток

            System.out.println("Is alive? " + t.isAlive());

        }

    }

    Выход:

    Current thread: Thread-0
    Is Alive? true
    
    Joining after 1000 mili seconds: 
    
    Current thread: Thread-0
    Is alive? false
    

    Замечания:

    • Если какой-либо исполняющий поток t1 вызывает join () на t2 т.е. t2.join () немедленно t1 перейдет в состояние ожидания, пока t2 не завершит свое выполнение.
    • Задание тайм-аута в join () приведет к аннулированию эффекта join () после определенного тайм-аута.

Рекомендации: StackOverflow

Эта статья предоставлена Dharmesh . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Параллелизм Java — методы yield (), sleep () и join ()

0.00 (0%) 0 votes