当前位置: 首页 > 面试题库 >

如何使另一个线程在Java中休眠

郭阳泽
2023-03-14
问题内容

我有一个扩展线程的类。该线程在运行时会花费大部分时间处于睡眠状态,它将执行检查,如果为true,则执行简单的操作,然后睡眠1/2秒并重复执行。

该类还具有由其他线程调用的公共方法。如果调用此方法,则我希望线程在已经处于休眠状态的情况下休眠更长的时间,或者在没有休眠的情况下立即休眠。我试图让this.sleep出现,但它似乎仍在休眠当前线程,并且它抱怨该方法sleep是静态的,应该被静态访问。

该程序显示了我的问题,当调用CauseSleep时,我希望它停止打印数字,直到该睡眠结束为止。

public class Sleeper {
    public static void main(String[] args) {
        new Sleeper();
    }
    public Sleeper() {
        System.out.println("Creating T");
        T t = new T();
        System.out.println("Causing sleep");
        t.CauseSleep();
        System.out.println("Sleep caused");
    }
    public class T extends Thread {
        public T() {
            this.start();
        }
        public void run() {
            for (int i = 0; i < 30; i++) {
                System.out.println("T Thread: " + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
            }
        }
        public void CauseSleep() {
            try {
                this.sleep(2000);
            } catch (InterruptedException e) {
            }
        }
    }
}

我得到的输出是

Creating T
Causing sleep
T Thread: 0
T Thread: 1
T Thread: 2
T Thread: 3
T Thread: 4
T Thread: 5
T Thread: 6
T Thread: 7
T Thread: 8
T Thread: 9
T Thread: 10
T Thread: 11
T Thread: 12
T Thread: 13
T Thread: 14
T Thread: 15
T Thread: 16
T Thread: 17
T Thread: 18
Sleep caused
T Thread: 19
T Thread: 20
T Thread: 21
T Thread: 22
T Thread: 23
T Thread: 24
T Thread: 25
T Thread: 26
T Thread: 27
T Thread: 28
T Thread: 29

问题答案:

您不能让另一个线程进入睡眠状态。(您可以使用不赞成使用的suspend()方法,但请不要使用)。这个电话:

this.sleep(200);

实际上会使 当前正在执行的 线程 处于 休眠状态-而不是Thread“ this” 所引用的线程。sleep是静态方法-
好的IDE会在该行上发出警告。

您应该只带有一个标语,上面写着“请睡”,然后让睡眠者线程在执行任何工作之前检查该标记。

不能使另一个线程进入睡眠状态是 一件 好事。假设它处于同步方法中-这意味着您将在睡眠时持有锁,从而导致其他所有人都试图获取同一锁来进行阻塞。不好
通过使用基于标志的系统,您可以以 受控的 方式入睡-在您知道这不会造成任何伤害的时候。



 类似资料:
  • 问题内容: 我正在用一个应用程序逻辑线程和一个数据库访问线程来制作Java应用程序。他们都坚持为应用程序和都需要的整个生命周期,以在同一时间运行(一个会谈到服务器,一个谈判给用户;当应用程序完全启动,我需要两个人工作)。 但是,在启动时,我需要确保最初应用线程等待直到数据库线程准备就绪(当前是通过轮询自定义方法确定的)。我不介意应用线程在数据库线程准备就绪之前是否阻塞。 看起来不是解决方案-db线

  • 我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是 “”“如果正确实施,以下几种方法应该可以奏效。 您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。) 您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中

  • 问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下

  • 问题内容: 我正在用Java Swing编写应用程序。我需要的是一个可以使用图形界面中的按钮停止“阐述”线程的过程。 这里有一个简单的项目专注于我的需求 问题很简单:在实际的应用程序中,用户设置一些选项,然后启动线程,对选定的数据进行详细说明。 我想提供一个“暂停”按钮,以便用户可以暂时停止详细说明并进行必要的检查,然后可以恢复操作。 我编码的方式是停止的图形线程,而不是“精化”线程。 如果运行示

  • 问题内容: 我正在使用SWT编写桌面应用程序。从另一个线程更新GUI控件的最简单方法是什么? 问题答案: 根据需要使用Display.asyncExec或Display.syncExec。 例如,另一个线程可能调用此方法来安全地更新标签: 这里更多

  • 主要内容:1 什么是Java 线程休眠,2 Java sleep()方法语法,3 Java sleep()方法例子1 什么是Java 线程休眠 Thread类的sleep()方法 用于使线程休眠指定的时间。 2 Java sleep()方法语法 Thread类提供了两种使线程休眠的方法: public static void sleep(long miliseconds)throws InterruptedException public static void sleep(long milis