JAVA 并发编程之九:sleep()和wait() 概念 + 区别 + 应用场景

本文详细探讨了JAVA中sleep()和wait()的区别,wait()需在持有对象锁的情况下调用,会释放锁并等待其他线程唤醒,而sleep()则不释放锁,直接暂停线程执行。在实际应用中,了解它们的使用场景对于优化并发程序至关重要。
摘要由CSDN通过智能技术生成

sleep和wait到底什么区别

其实这个问题应该这么问——sleep和wait有什么相同点。因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点。

wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法。

sleep方法是Thread类的静态方法。

 

wait

wait是在当前线程持有wait对象锁的情况下,暂时放弃锁,并让出CPU资源,并积极等待其它线程调用同一对象的notify或者notifyAll方法。注意,即使只有一个线程在等待,并且有其它线程调用了notify或者notifyAll方法,等待的线程只是被激活,但是它必须得再次获得锁才能继续往下执行。换言之,即使notify被调用,但只要锁没有被释放,原等待线程因为未获得锁仍然无法继续执行。测试代码如下所示

import java.util.Date;

public class Wait {

  public static void main(String[] args) {
    Thread thread1 = new Thread(() -> {
      synchronized (Wait.class) {
        try {
          System.out.println(new Date() + " Thread1 is running");
          Wai
pthread_cond_wait() 可以用于线程之间的同步,当一个线程需要等待另一个线程完成某个操作后再继续执行时,可以使用 pthread_cond_wait()。下面是一个简单的示例: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int count = 0; void *producer(void *arg) { for (int i = 0; i < 10; i++) { pthread_mutex_lock(&mutex); // 加锁 count++; printf("Producer: produced item %d\n", count); pthread_cond_signal(&cond); // 发送信号 pthread_mutex_unlock(&mutex); // 解锁 } pthread_exit(NULL); } void *consumer(void *arg) { for (int i = 0; i < 10; i++) { pthread_mutex_lock(&mutex); // 加锁 while (count == 0) { // 如果 count 为 0,等待信号 pthread_cond_wait(&cond, &mutex); } printf("Consumer: consumed item %d\n", count); count--; pthread_mutex_unlock(&mutex); // 解锁 } pthread_exit(NULL); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, producer, NULL); pthread_create(&tid2, NULL, consumer, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; } ``` 在这个示例中,生产者线程和消费者线程共享一个变量 count,生产者线程不断地增加 count,消费者线程不断地减少 count,但是当 count 为 0 时,消费者线程必须等待生产者线程生产出新的物品。为了实现这个功能,我们使用了 pthread_cond_wait()。在消费者线程中,如果 count 为 0,就调用 pthread_cond_wait() 等待生产者线程发送信号。当生产者线程生产出新的物品时,调用 pthread_cond_signal() 发送信号,消费者线程就可以继续执行了。注意,在使用 pthread_cond_wait() 时,必须先加锁,等待信号时自动解锁,信号到来时自动加锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师训练营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值