java线程通信的方法有哪些

Java线程通信的方法有很多,主要包括以下几种:

1、使用wait()和notify()方法

java线程通信的方法有哪些

2、使用synchronized关键字

3、使用Lock接口及其实现类(如ReentrantLock)

4、使用Condition接口及其实现类(如ReentrantLock)

5、使用CountDownLatch

6、使用CyclicBarrier

7、使用Semaphore

8、使用Future和Callable接口

java线程通信的方法有哪些

9、使用ExecutorService和ThreadPoolExecutor

10、使用BlockingQueue

下面详细介绍这些方法的原理和用法。

1、使用wait()和notify()方法

wait()方法使当前线程进入等待状态,直到其他线程调用此对象的notify()方法或notifyAll()方法,这是一种基本的线程间通信方式,但需要注意的是,如果一个线程在调用wait()方法后被中断,那么它将抛出InterruptedException异常。

notify()方法用于唤醒在此对象监视器上等待的单个线程,如果需要唤醒所有等待的线程,可以使用notifyAll()方法,这两个方法都可以在同步代码块或者同步方法中使用。

class Message {
    private String content;
    private boolean hasData;
    public synchronized void put(String data) throws InterruptedException {
        while (hasData) {
            wait();
        }
        this.content = data;
        this.hasData = true;
        notify();
    }
    public synchronized String take() throws InterruptedException {
        while (!hasData) {
            wait();
        }
        this.hasData = false;
        notify();
        return content;
    }
}

2、使用synchronized关键字

java线程通信的方法有哪些

synchronized关键字可以修饰方法或者代码块,用于实现线程间的同步,当一个线程获得对象的锁时,其他线程将无法访问该对象,直到锁被释放,synchronized关键字可以保证在同一时刻只有一个线程能够访问共享资源,从而实现线程间的通信。

class Counter {
    private int count;
    public synchronized void increment() {
        count++;
    }
    public synchronized int getCount() {
        return count;
    }
}

3、使用Lock接口及其实现类(如ReentrantLock)

Lock接口及其实现类提供了与synchronized关键字类似的功能,但更加灵活,Lock接口提供了获取和释放锁的方法,以及尝试获取锁的方法(lock、tryLock),ReentrantLock是Lock接口的一个常用实现类。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class CounterWithLock extends ThreadLocal<Integer> {
    private final Lock lock = new ReentrantLock();
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            lock.lock(); // 获取锁
            int count = get(); // 获取当前计数器的值并加1
            try { Thread.sleep(1);} catch (InterruptedException e) {} finally { lock.unlock();} // 释放锁并休眠1毫秒以模拟耗时操作
            set(count + 1); // 将新的计数值设置到当前线程的ThreadLocal变量中,并唤醒其他等待的线程(如果有的话)
        }
    }
}

4、使用Condition接口及其实现类(如ReentrantLock)

Condition接口及其实现类是另一种实现线程间通信的方式,它允许一个线程等待某个条件满足,然后再执行相应的操作,Condition接口的实现类通常与Lock接口一起使用,以确保线程在等待条件满足时获得锁,ReentrantLock是Condition接口的一个常用实现类。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.LockSupport;
public class ConditionExample implements ConditionInterface{ // 实现ConditionInterface接口定义的waitFor和signal方法 ConditionInterface conditionInterface=new ConditionExample(); //创建Condition实例 ReentrantLock lock=new ReentrantLock(); //创建锁 lock.lock(); //锁定 conditionInterface.waitFor(this,5000); //等待5秒 conditionInterface.signalFor(this); //通知其他线程继续执行 lock.unlock(); //解锁 lock=null; System.gc(); //清理内存空间 conditionInterface=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 conditionInterface=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空间 lock=null; System.gc();//清理内存空

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/176305.html

(0)
K-seoK-seoSEO优化员
上一篇 2023年12月28日 16:20
下一篇 2023年12月28日 16:24

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入