当前位置: 首页 > wzjs >正文

推荐o2o网站建设win7建设网站教程

推荐o2o网站建设,win7建设网站教程,网站群 米拓,wordpress搭建过程目录 线程通信的定义使用 wait() / notify() 通信使用 join() 实现线程串行使用 volatile 实现可见性通信使用 LockSupport使用 Condition使用 BlockingQueue使用 CountDownLatch、CyclicBarrier、Semaphore使用 Future / CompletableFuture总结 1.线程通信的定义 线程通信是…

目录

  1. 线程通信的定义
  2. 使用 wait() / notify() 通信
  3. 使用 join() 实现线程串行
  4. 使用 volatile 实现可见性通信
  5. 使用 LockSupport
  6. 使用 Condition
  7. 使用 BlockingQueue
  8. 使用 CountDownLatchCyclicBarrierSemaphore
  9. 使用 Future / CompletableFuture
  10. 总结

1.线程通信的定义

线程通信是指多个线程在协同完成某个任务时,为了数据同步或协作调度而相互传递信息或等待状态变化的机制。

常见目的:

  • 数据共享同步(生产者-消费者)
  • 控制线程顺序(线程 A -> 线程 B)
  • 等待某一条件满足后继续执行

2.使用 wait() / notify() 通信

最基础的通信方式,依赖对象锁和监视器机制。

示例:

class Shared {private boolean ready = false;public synchronized void waitForSignal() throws InterruptedException {while (!ready) {wait(); // 释放锁 + 阻塞}System.out.println("Signal received!");}public synchronized void sendSignal() {ready = true;notify(); // 唤醒等待线程}
}

特点:

  • 必须配合 synchronized 使用
  • wait() 会释放锁,notify() 不会
  • 建议使用 while 判断条件防止虚假唤醒

3.使用 join() 实现线程串行

等待其他线程执行完成,适合线程之间有执行顺序依赖的场景。

示例:

Thread t1 = new Thread(() -> {System.out.println("T1 done");
});
Thread t2 = new Thread(() -> {try {t1.join();System.out.println("T2 done after T1");} catch (InterruptedException e) {}
});t1.start();
t2.start();

4.使用 volatile 实现可见性通信

适用于简单的标志状态共享,如线程停止。

示例:

class Flag {volatile boolean stop = false;
}Flag flag = new Flag();new Thread(() -> {while (!flag.stop) {// do work}
}).start();Thread.sleep(1000);
flag.stop = true;

特点:

  • 保证线程间变量的可见性
  • 不保证原子性
  • 适合轻量级信号传递

5.使用 LockSupport

线程阻塞和唤醒的底层工具,替代 wait/notify,无需加锁。

示例:

Thread t = new Thread(() -> {System.out.println("Thread park");LockSupport.park();System.out.println("Thread unparked");
});
t.start();Thread.sleep(1000);
LockSupport.unpark(t);

特点:

  • 每个线程有一个许可证(类似信号量)
  • 更灵活,不依赖同步锁
  • 常用于实现框架级线程调度

6.使用 Condition

Lock 的增强版 wait/notify,支持多个条件队列。

示例:

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();Thread t1 = new Thread(() -> {lock.lock();try {condition.await(); // 类似 wait()System.out.println("Thread t1 resumed");} catch (InterruptedException e) {} finally {lock.unlock();}
});Thread t2 = new Thread(() -> {lock.lock();condition.signal(); // 类似 notify()lock.unlock();
});

特点:

  • 可精准唤醒特定条件队列中的线程
  • 支持多个等待队列

7.使用 BlockingQueue

适合生产者-消费者模式,线程安全队列内置通信机制。

示例:

BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5);new Thread(() -> {try {queue.put(1); // 阻塞直到有空间} catch (InterruptedException e) {}
}).start();new Thread(() -> {try {Integer value = queue.take(); // 阻塞直到有元素System.out.println("Consumed: " + value);} catch (InterruptedException e) {}
}).start();

8.使用 CountDownLatch/CyclicBarrier/Semaphore

CountDownLatch

用于一个线程等待多个线程完成:

CountDownLatch latch = new CountDownLatch(2);new Thread(() -> {latch.countDown(); // 执行完毕
}).start();latch.await(); // 等待所有线程执行完

CyclicBarrier

适合多个线程在某个点同步:

CyclicBarrier barrier = new CyclicBarrier(3, () -> {System.out.println("All threads reached barrier");
});new Thread(() -> {barrier.await();
}).start();

Semaphore

用于控制线程数量(资源数):

Semaphore semaphore = new Semaphore(2); // 允许2个线程同时访问semaphore.acquire();
try {// 访问共享资源
} finally {semaphore.release();
}

9.使用 Future / CompletableFuture

线程间通过结果对象通信,适合异步执行与回调。

示例:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {return "result";
});String result = future.get(); // 阻塞直到任务完成

CompletableFuture

CompletableFuture.supplyAsync(() -> "Hello").thenApply(str -> str + " World").thenAccept(System.out::println);

总结

方式适用场景是否阻塞特点
wait/notify精细通信必须配合锁
join等待线程完成简单串行依赖
volatile状态通知可见性但无原子性
LockSupport框架底层调度灵活、无锁
Condition多条件控制精细唤醒
BlockingQueue生产者消费者内置通信机制
CountDownLatch等待一组线程一次性门闩
CyclicBarrier多线程集结可重复使用
Semaphore控制访问数量控制并发度
Future/CompletableFuture异步编程支持回调返回值通信
http://www.dtcms.com/wzjs/834720.html

相关文章:

  • 上海网站制作开发网络媒体广告公司
  • 珠海市做网站公司网站建设书籍免费
  • 手机网站页面尺寸一学一做短视频网站
  • 房地产网站策划书中国式现代化是自主产权
  • 桓台新城建设有限公司网站做cpa能用什么网站
  • 广州做网站优化费用网站开发加设计要多少钱
  • 织梦安装网站后图片网站系统繁忙
  • 仙游县网站建设网页设计与网站建设作业答案
  • 网站开发收费如何设计自己公司网页
  • 家装e站杭州小程序建设
  • 关于拳馆网站建设计划书wordpress写文章怎么添加图片
  • 安国市城乡建设局网站怎么拥有自己的网站
  • 构建网站需要会什么意思太原如何做百度的网站
  • 奥林匹克做校服的网站深圳创业孵化基地入驻条件
  • 代理上海建站公司注册门户网站建设汇报材料
  • 北京网站建设公司内江网站开发会用到的框架
  • 大同市网站建设胶带制作彩虹光影图片
  • 收费下载的wordpress网站商城网站备案需要什么
  • 东莞网站推广建设ssh做的大型网站
  • 网站建站建设深圳华鑫峰网站建设
  • 站点建错了网页能打开吗wordpress 每页 关高
  • 申请一个网站空间虚拟主机是指什么
  • dede网站地图路径东莞网红打卡地
  • 浙江省信息港官网潍坊seo招聘
  • 江门网站建设服务做网站赚不到钱了
  • wordpress基础主题站WordPress主题如何更新
  • 网站为什么被kwordpress 固态链接
  • 个人注册网站怎么注册网店推广的常用方法有哪些
  • 第一次做网站时是怎样的心情网站配色设计
  • 成都网站制网络营销的方法