java 在main方法内部调用了thread.sleep方法,它会暂停哪个线程?

1bqhqjot  于 2023-04-04  发布在  Java
关注(0)|答案(4)|浏览(248)

我对Thread.sleep()的工作原理有点困惑:
1.如果我在main方法中调用它,并且有其他创建的线程正在运行。它会暂停什么:是单独的主线程还是所有的子线程(将它们视为主线程的一部分)?例如:

public static void main(String arg[])
 { 
     Thread t1 = new Thread();
     t1.start();
     Thread.Sleep(1000);
 }

1.如果我在一个线程的run()方法内部调用sleep()方法,当在main内部为该线程调用start()方法时,它是否也会暂停其他线程?因为我就发生过这种情况......尽管我知道在这种情况下它应该只暂停内部调用的线程。例如:

//thread Tester has a sleep() in its run() while NoSleep doesn't have
  public static void main(String arg[])
  { 
      Tester t1 = new Tester();
      NoSleep t2 = new NoSleep();
      t1.start();
      t2.start();
 }

在这样的代码中,t2t1都暂停了,我不明白为什么。

bttbmeg0

bttbmeg01#

在Java中,线程都是平等的对等体,没有分组、父子关系或所有权。
所以休眠任何一个线程对其他线程没有直接影响。
调用Thread.sleep会使执行该方法的任何线程休眠。非常简单,没有更多的解释。
正如Thread.sleep Javadoc所说:
使当前执行的线程休眠(暂时停止执行)指定的毫秒数
顺便说一下,在现代Java中,我们很少需要直接寻址Thread类。相反,我们使用执行器服务来执行RunnableCallable任务。因此不需要调用new Thread。也不需要从Thread扩展。

ee7vknir

ee7vknir2#

sleep()暂停正在执行代码的当前线程,它对其他线程没有影响。该线程可以是“主”线程或从主线程派生(启动)的线程。
Thread.睡眠()不是实现异步任务的方法,比如通过Thread.sleep挂起某个线程等待(),然后猜测经过那么长时间后我可以恢复我的线程,并希望事件必须已经完成,您的睡眠线程正在等待。您将使用一些低级机制,如notify,wait,notifyAll。而不是使用Semaphores,倒计时锁存器和其他更好的 Package 器建议在其他答案。评论下面的更多信息或疑问,你有,很乐意帮助

zbsbpyhn

zbsbpyhn3#

Thread.sleep()是Java中许多名字很糟糕的东西之一。* 不要认为它“睡眠”任何线程。有一种更简单的方法来考虑它:
Thread.sleep(n)什么都不做。
它至少在n毫秒内不做任何事情,然后返回。这就是您需要了解的关于sleep()的全部内容(至少,在您成为Java运行时环境的维护者之前,您需要了解的全部内容)。

  • Java是由几个非常聪明的计算机科学家博士发明的。但他们给某些东西起了名字,这些东西对Maven来说似乎是显而易见的,但有时却会让初学者感到困惑。
m528fe3b

m528fe3b4#

我知道我迟到了,但要明确地回答你的问题-Thread.sleep(n),其中n是毫秒,导致当前线程睡眠,不影响其他线程。
1.如果你在main方法中调用Thread.sleep(1000),如下所示,你的主线程将休眠1秒,而其他线程将继续运行。

class Task extends Thread {

  @Override
  public void run() {
    for (int i = 0; i < 3; i++) {
      System.out.println(
          "Hello! I am " + Thread.currentThread().getName() + " running without sleep - " + i);
    }

  }
}

public class ThreadSleepExample {

  public static void main(String[] args) throws InterruptedException {
    Task task = new Task();
    task.start();
    task.setName("Task Thread");
    Thread.sleep(1000);
    Thread.currentThread().setName("Main Thread");
    System.out.println(
        "Hello! I am " + Thread.currentThread().getName() + " and I slept for a while"); //This line gets printed after 1 second.

  }
}

输出-

Hello! I am Task Thread running without sleep - 0
Hello! I am Task Thread running without sleep - 1
Hello! I am Task Thread running without sleep - 2
Hello! I am Main Thread and I slept for a while

1.现在,当您在run方法中调用Thread.sleep(n)时,它会导致该线程休眠,而包括主线程在内的其他线程不受影响。

class TaskWithSleep extends Thread {
  @Override
  public void run() {
    for (int i = 0; i < 3; i++) {
      System.out.println(
          "Hello! I am " + Thread.currentThread().getName() + " running with sleep - " + i);
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    }
  }
}

class TaskWithoutSleep extends Thread {
  @Override
  public void run() {
    for (int i = 0; i < 3; i++) {
      System.out.println(
          "Hello! I am " + Thread.currentThread().getName() + " running without sleep - " + i);
    }
  }
}

public class ThreadSleepExample {

  public static void main(String[] args) {
    TaskWithSleep sleepTask = new TaskWithSleep();
    sleepTask.setName("SleepTask Thread");

    TaskWithoutSleep withoutSleepTask = new TaskWithoutSleep();
    withoutSleepTask.setName("WithoutSleepTask Thread");

    sleepTask.start();
    withoutSleepTask.start();

    Thread.currentThread().setName("Main Thread");
    System.out.println("I am " + Thread.currentThread().getName()
        + " and I remain unaffected by sleep inside other threads");

  }
}

在这里,SleepTask Thread会在打印完每一行后暂停1秒。而其他线程,如WithoutSleepTask ThreadMain Thread会继续执行。
这里是输出-

I am Main Thread and I remain unaffected by sleep inside other threads
Hello! I am WithoutSleepTask Thread running without sleep - 0
Hello! I am SleepTask Thread running with sleep - 0
Hello! I am WithoutSleepTask Thread running without sleep - 1
Hello! I am WithoutSleepTask Thread running without sleep - 2
Hello! I am SleepTask Thread running with sleep - 1
Hello! I am SleepTask Thread running with sleep - 2

因此,在您的示例中,t1应该处于休眠状态,而t2应该正常执行。

相关问题