Thread 代码 wait sleep 区别

本文深入探讨了Java中线程的启动与停止机制,并对比分析了sleep、yield、wait等方法的特点与适用场景,强调了合理选择线程控制方法的重要性。
public class ThreadTest {
    int a;
    private boolean _maintenanceThreadStarted = true;

    public void task() {
        System.out.println(++a + "  " + Thread.currentThread().getId());
    }

    public void startThread() {
        (new Thread() {
            public void run() {
                while (_maintenanceThreadStarted) {
                    task();
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }).start();
    }

    public void startServiceThread() {
        Runnable r = new Runnable() {
            public void run() {
                while (_maintenanceThreadStarted) {
                    task();
                    if (a > 100) {
                        _maintenanceThreadStarted = false;
                    }
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        };
        Thread _serviceThread = new Thread(r, "SessionPoolServer-RequestServiceThread");
        _serviceThread.start();
    }

    public void stopMaintenanceThread() {
        _maintenanceThreadStarted = false;
    }

    public static void main(String[] args) throws Exception {
        ThreadTest a = new ThreadTest();
        a.startThread();
        new ThreadTest().startServiceThread();
        Thread.sleep(5000);
        a.stopMaintenanceThread();
        System.out.println("end");
    }

}

 

 

 

从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列)。并且在某一时刻cpu只为ready queue中位于队列头部的线程服务。
但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield。
或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep。

sleep方法不推荐使用,可用wait。
线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行。

sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。

当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。

waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

 

 

 

 

. wait()、notify()、notifyAll()和suspend()、resume()、sleep()的讨论
4.1 这两组函数的区别
1) wait()使当前线程进入停滞状态时,还会释放当前线程所占有的“锁标志”,从而使线程对象中的synchronized资源可被对象中别的线程使用;而suspend()和sleep()使当前线程进入停滞状态时不会释放当前线程所占有的“锁标志”。
2) 前一组函数必须在synchronized函数或synchronized block中调用,否则在运行时会产生错误;而后一组函数可以non-synchronized函数和synchronized block中调用。
4.2 这两组函数的取舍
Java2已不建议使用后一组函数。因为在调用sleep()时不会释放当前线程所取得的“锁标志”,这样很容易造成“死锁”。

 

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
<think>嗯,用户想知道编程中waitsleep区别和用法。首先,我需要回忆这两个概念的基本定义。Sleep应该是让当前线程暂停一段时间,比如Java中的Thread.sleep(),而wait通常和同步机制相关,比如Object.wait()。但用户提到的引用里提到了条件变量和监视器,这可能和线程同步有关。 接下来,我应该区分它们的用途。Sleep主要用于让线程暂停执行,不涉及锁的释放。而wait用于线程间协作,会释放锁,直到被notify唤醒。不过需要确认是否正确,比如在Java中,wait必须在synchronized块里调用,否则会抛异常。 然后,用户的问题可能涉及到多线程编程中的常见误区。比如,为什么在单线程应用中还要考虑wait和notify的问题?根据引用[2],用户提到在单线程应用里不使用这些方法,但可能某些框架或库内部使用了,比如Celery这样的任务队列(引用[3])。不过这可能和问题无关,但需要明确回答。 另外,引用[4]提到descriptor heap,这和图形编程相关,可能用户混淆了不同上下文中的术语,但这里的问题是关于编程中的waitsleep,所以应该忽略这部分引用。 现在需要整理结构:先定义两者,再对比不同点,比如锁处理、使用场景、唤醒机制等。然后给出代码示例,比如Java中的sleepwait用法,注意异常处理。可能还要提到其他语言中的类似机制,比如Python的time.sleep()和threading.Condition.wait()。 用户可能真正的问题是在多线程环境下如何正确使用这两个方法,避免死锁或资源竞争。比如,误用sleep可能导致线程不释放锁,而wait则释放锁,允许其他线程执行。同时,唤醒的条件需要满足,否则可能无限等待。 需要确认引用中的内容是否相关。引用[1]提到条件变量和监视器的调度,这支持了wait通常与条件变量一起使用的观点。引用[2]的问题是关于避免使用wait/notify,但回答时需要解释在单线程应用中可能不需要,但多线程时必须用。引用[3]提到的Celery可能涉及任务调度,但可能不在当前问题范围内。 总结回答结构:定义、区别(锁、唤醒、使用场景)、代码示例、应用场景,相关问题。确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但这里可能用不上数学公式,但需要检查是否有需要的地方。比如,可能提到超时时间可以用数学符号表示,如$t$秒。 最后生成相关问题,比如适用场景、替代方法、异常处理等。确保引用正确,比如引用[1]和[2]中的内容,如果相关的话。</think>### waitsleep区别及用法解析 在编程中,`wait`和`sleep`都与线程控制相关,但设计目标和应用场景有本质区别。以下从多角度对比两者的差异: --- #### 1. **设计目标** - **`sleep`**: 用于让当前线程主动暂停执行指定时间(如$t$秒),不涉及线程间通信。例如: ```java Thread.sleep(1000); // 线程暂停1秒 ``` - **`wait`**: 用于线程间协作,需配合锁(如`synchronized`块)和`notify()`使用。例如: ```java synchronized(lock) { lock.wait(); // 释放锁并等待其他线程唤醒 } ``` --- #### 2. **核心差异** | 特性 | `sleep` | `wait` | |-----------------|----------------------------------|---------------------------------| | **锁的释放** | 不释放锁 | 释放锁 | | **唤醒机制** | 仅通过超时自动唤醒 | 可通过`notify()`或超时唤醒 | | **调用场景** | 任何线程中直接调用 | 必须在同步块(如`synchronized`)内调用 | | **所属类/接口** | 通常为线程类方法(如`Thread`) | 对象方法(如`Object.wait()`) | --- #### 3. **代码示例对比** - **使用`sleep`控制执行间隔**: ```python import time print("开始") time.sleep(2) # 暂停2秒,不释放任何锁 print("结束") ``` - **使用`wait`实现线程协作**(Java示例): ```java synchronized(lock) { while (conditionNotMet) { lock.wait(); // 释放锁,等待其他线程修改条件后调用notify() } // 条件满足后继续执行 } ``` --- #### 4. **应用场景** - **`sleep`适用场景**: - 控制任务执行频率(如轮询间隔) - 模拟耗时操作 - **`wait`适用场景**: - 生产者-消费者模型中的资源协调 - 多线程条件等待(如等待数据库连接就绪) --- #### 5. **注意事项** - **`sleep`的可靠性**:实际暂停时间可能因系统调度略有偏差[^1]。 - **`wait`的虚假唤醒**:需在循环中检查条件,避免被意外唤醒[^2]。 - **单线程应用**:若程序无并发需求,`wait`和`notify`可完全省略(如引用[2]中匿名用户的问题)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值