В многопоточности, почему другие потоки не работают, когда я приостановил один поток для выполнения - PullRequest
0 голосов
/ 01 июля 2018

В моем программировании три потока. В соответствии с концепцией потоков все потоки работают асинхронно. Таким образом, каждый поток выполняется процессором случайным образом. Если я только что приостановил выполнение одного потока с помощью thread.sleep (), тогда другой поток должен работать. Правильно?? И когда время ожидания потока истекло, он должен снова продолжить выполнение. Но в моем случае, когда я приостанавливаю один поток с помощью t2.sleep (10000), все остальные потоки также останавливаются. Но они должны были работать нормально, пока поток t2 находится в ожидании. Может кто-нибудь сказать мне, почему это так?

    import java.util.*;
    class square extends Thread
    {
       public int x;
       public square(int x)
       {
          this.x = x;
       }
       public void run()
       {
          System.out.println("Square of the number is " + x*x);
       }
    }
    class cube extends Thread
    {
       public int x;
       public cube(int x)
       {
          this.x = x;
       }
       public void run()
       {
           System.out.println("Cube of the number is " + x*x*x);
       }
    }

    class randgen extends Thread
    {
        public void run()
        {
           int num=0;
           Random r = new Random();
           try
           {
              for(int i=0;i<5;i++)
              {
                 num = r.nextInt(100);
                 System.out.println("The number generated is " + num);
                 square t2 = new square(num);
                 t2.start();
                 t2.sleep(10000);
                 cube t3 = new cube(num);
                 t3.start();

              }
          }
        catch(InterruptedException e)
        {
            System.out.println(e.getMessage());
        }
      }
}
public class Main
{
    public static void main(String args[])
    {
        randgen obj = new randgen();
        obj.start();

    }
}

OUTPUT

Сгенерированный номер 50
Площадь номера 2500
(После 10 с) Куб числа 125000
Сгенерированный номер 36
Квадрат числа 1296
(После 10 с)
Сгенерированный номер 75
Куб с номером 46656
Квадрат числа 5625
(После 10 с)
Сгенерированный номер 92
Куб числа 421875
Квадрат числа 8464
(После 10 с)
Сгенерированный номер 0
Куб с номером 778688
Квадрат числа 0 (После 10 с)
Куб числа 0

Почему я получаю вывод через 10 секунд, вместо этого по концепции потока тот поток, который я приостанавливаю, должен останавливаться только на 10 секунд, а другой поток должен работать синхронно.

Ответы [ 3 ]

0 голосов
/ 01 июля 2018
square t2 = new square(num);
t2.start();
t2.sleep(10000);
cube t3 = new cube(num);
t3.start();

Вы спите в течение 10 секунд , прежде чем вы начинаете t3.

Попробуйте поместить sleep() в класс:

public void run()
{
    System.out.println("Square of the number is " + x*x);
    sleep(10000);
}
0 голосов
/ 01 июля 2018

Thread.sleep - это статический метод. Вызов t2.sleep(10000) не приостанавливает t2, он приостанавливает текущий поток. Итак, что вы на самом деле делаете, начинаете t2, ждете 10 секунд, а затем начинаете t3. Если вы хотите приостановить поток t2, не вызывайте t2.sleep(10000) из randgen, вместо этого вызывайте Thread.sleep(10000) изнутри square.run().

  public void run()
   {
      Thread.sleep(10000);
      System.out.println("Square of the number is " + x*x);
   }
0 голосов
/ 01 июля 2018

, потому что вы звоните t2.sleep(10000); из основного потока, который вызывает его сон (даже если вы обращаетесь к нему с помощью t2)

Вы также можете увидеть ответ здесь

Вы не можете заставить другой поток спать по умолчанию.

...