1、使用wait()和notify()方法
2、使用synchronized关键字
3、使用Lock接口及其实现类(如ReentrantLock)
4、使用Condition接口及其实现类(如ReentrantLock)
5、使用CountDownLatch
6、使用CyclicBarrier
7、使用Semaphore
8、使用Future和Callable接口
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关键字
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