Java多线程实现阻塞和唤醒

原创 深藏阁楼爱情的钟 2024-11-08 22:27 75阅读 0赞

在Java中,多线程编程是处理并发任务的一种方式。阻塞和唤醒是多线程编程中常用的概念,它们可以帮助我们控制线程的执行顺序和协调线程间的工作。以下是一些Java中实现阻塞和唤醒的基本方法:

1. 使用wait()notify()

wait()notify()方法是Object类的方法,可以用来实现线程间的协作。当一个线程调用wait()方法时,它会释放对象的锁并进入等待状态,直到其他线程调用相同对象的notify()notifyAll()方法。

```javapublic class WaitNotifyExample {
public static void main(String[] args) {
Object lock = new Object();
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println(“Thread1 is waiting”);
lock.wait();
System.out.println(“Thread1 is resumed”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread t2 = new Thread(() -> {
synchronized (lock) {
System.out.println(“Thread2 is notifying”);
lock.notify();
}
});

t1.start();
try {
Thread.sleep(1000); //确保t1先执行} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}
``###2. 使用Condition对象Conditionjava.util.concurrent.locks包中的一个接口,它提供了比wait()notify()更灵活的线程通信机制。Condition`允许一个线程在某个条件不满足时释放锁并等待,直到其他线程在相同条件下通知它。

```javaimport java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionExample {
private final ReentrantLock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();

public void await() throws InterruptedException {
lock.lock();
try {
System.out.println(“Thread is waiting”);
condition.await();
System.out.println(“Thread is resumed”);
} finally {
lock.unlock();
}
}

public void signal() {
lock.lock();
try {
System.out.println(“Thread is signaling”);
condition.signal();
} finally {
lock.unlock();
}
}

public static void main(String[] args) throws InterruptedException {
ConditionExample example = new ConditionExample();
Thread t1 = new Thread(() -> {
try {
example.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
});

Thread t2 = new Thread(() -> {
example.signal();
});

t1.start();
Thread.sleep(1000); //确保t1先执行t2.start();
}
}
``###3. 使用CountDownLatch`

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

```javaimport java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);

Thread t1 = new Thread(() -> {
try {
latch.await();
System.out.println(“Thread1 is resumed”);
} catch (InterruptedException e) {
e.printStackTrace();
}
});

Thread t2 = new Thread(() -> {
System.out.println(“Thread2 is counting down”);
latch.countDown();
});

t1.start();
Thread.sleep(1000); //确保t1先执行t2.start();
}
}
```这些是Java中实现阻塞和唤醒的一些基本方法。根据具体的应用场景,你可以选择最适合的方法来实现线程间的协调。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,75人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线问题:阻塞唤醒

    在Java多线程编程中,"阻塞"和"唤醒"是两个重要的概念。 1. 阻塞: 当一个线程调用某个方法或访问某个资源时,如果该资源当前已被其他线程占用,并且这个方法或者资源

    相关 Java线唤醒阻塞

    阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一 定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。 转载