在多线程中,为什么我暂停了一个线程来执行后其他线程却无法工作

时间:2018-07-01 12:56:12

标签: java multithreading extends

我的编程中有三个线程。根据线程概念,所有线程都是异步运行的。因此,每个线程都由处理器随机执行。如果我刚刚通过使用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();

    }
}

输出

  

生成的数字是50
  数字的平方是2500
  (10秒后)   多维数据集是125000
  生成的数字是36
  数的平方是1296
  (10秒后)
  生成的数字是75
  多维数据集是46656
  数的平方是5625
  (10秒后)
  生成的数字是92
  多维数据集是421875
  数的平方是8464
  (10秒后)
  生成的数字为0
  立方数为778688
  数字的平方为0   (10秒后)
  数字的立方为0

为什么我在10s之后得到输出,而不是线程的概念,我正在暂停的线程只能暂停10s,而其他线程应该同步工作。

3 个答案:

答案 0 :(得分:3)

Thread.sleep static 方法。调用t2.sleep(10000)不会暂停t2,它会暂停当前线程。因此,您实际要做的是开始t2,等待10秒钟,然后开始t3。如果要暂停线程t2,请不要从randgen调用t2.sleep(10000),而是从Thread.sleep(10000)内部调用square.run()

  public void run()
   {
      Thread.sleep(10000);
      System.out.println("Square of the number is " + x*x);
   }

答案 1 :(得分:1)

因为您正在从主线程中调用t2.sleep(10000);,这会导致它休眠(即使您使用t2进行访问)

您也可以here看到答案

默认情况下,您不能强制其他线程进入睡眠状态。

答案 2 :(得分:1)

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);
}