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

freenom网站建设关键词怎么选择技巧

freenom网站建设,关键词怎么选择技巧,哪个平台可以免费打广告,广州市住房与城乡建设部网站异步与同步的核心区别 同步调用:调用方阻塞等待结果返回异步调用:调用方立即返回,通过回调/轮询等方式获取结果 本文重点讨论如何将异步调用转为同步阻塞模式,以下是五种实现方案: 方法一:使用wait/noti…

异步与同步的核心区别

  • 同步调用:调用方阻塞等待结果返回
  • 异步调用:调用方立即返回,通过回调/轮询等方式获取结果

本文重点讨论如何将异步调用转为同步阻塞模式,以下是五种实现方案:

方法一:使用wait/notify + synchronized

代码示例

 public class ProducerConsumerExample {private static final int BUFFER_SIZE = 5;private final Object lock = new Object();private int[] buffer = new int[BUFFER_SIZE];private int count = 0;// 生产者线程public void produce() throws InterruptedException {int value = 0;while (true) {synchronized (lock) {while (count == BUFFER_SIZE) {System.out.println("缓冲区已满,生产者等待...");lock.wait();}buffer[count++] = value++;System.out.println("生产数据: " + value + ",缓冲区数量: " + count);lock.notify();}Thread.sleep(1000);}}// 消费者线程public void consume() throws InterruptedException {while (true) {synchronized (lock) {while (count == 0) {System.out.println("缓冲区为空,消费者等待...");lock.wait();}int value = buffer[--count];System.out.println("消费数据: " + value + ",缓冲区数量: " + count);lock.notify();}Thread.sleep(1500);}}public static void main(String[] args) {ProducerConsumerExample example = new ProducerConsumerExample();// 启动生产者和消费者线程new Thread(example::produce).start();new Thread(example::consume).start();}}

关键要点

  1. 共享资源保护:通过synchronized(lock)保证线程安全

  2. 条件判断

    • while循环而非if防止虚假唤醒
    • 缓冲区满时生产者等待(wait())
    • 缓冲区空时消费者等待(wait())
  3. 协作机制:每次操作后通过notify()唤醒等待线程

  4. 方法对比

    • notify():唤醒单个等待线程
    • notifyAll():唤醒所有等待线程(适用于多生产者场景)

方法二:使用ReentrantLock + Condition

代码示例

 import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class TestReentrantLock4 {static ReentrantLock lock = new ReentrantLock();static Condition moneyCondition = lock.newCondition();static Condition ticketCondition = lock.newCondition();static boolean haveMoney = false;static boolean haveTicket = false;public static void main(String[] args) throws InterruptedException {// 农民1(等钱)new Thread(() -> {lock.lock();try {while (!haveMoney) {System.out.println("农民1等待资金...");moneyCondition.await();}System.out.println("农民1获得资金,回家!");} finally {lock.unlock();}}, "Farmer1").start();// 农民2(等票)new Thread(() -> {lock.lock();try {while (!haveTicket) {System.out.println("农民2等待车票...");ticketCondition.await();}System.out.println("农民2获得车票,回家!");} finally {lock.unlock();}}, "Farmer2").start();// 主线程模拟发放条件Thread.sleep(1000);lock.lock();try {haveMoney = true;moneyCondition.signal();System.out.println("资金已发放!");haveTicket = true;ticketCondition.signal();System.out.println("车票已发放!");} finally {lock.unlock();}}}

核心特性

  1. 多条件支持

    • 一个锁对象可绑定多个Condition(如moneyCondition/ticketCondition)
  2. 精准唤醒

    • await():释放锁并等待特定条件
    • signal():唤醒满足条件的等待线程
  3. 代码结构

    • 必须在lock.lock()finally unlock()之间操作
    • 条件判断使用while循环防止虚假唤醒

方法三:Future(Callable + ExecutorService)

代码示例

 import java.util.concurrent.*;public class FutureExample {public static void main(String[] args) {ExecutorService executor = Executors.newSingleThreadExecutor();Future<Integer> future = executor.submit(() -> {int sum = 0;for (int i = 1; i <= 100; i++) {sum += i;Thread.sleep(10);}return sum;});System.out.println("主线程执行其他任务...");try {Integer result = future.get(2, TimeUnit.SECONDS);System.out.println("计算结果: 1+2+...+100 = " + result);} catch (TimeoutException e) {System.err.println("计算超时!");future.cancel(true);} catch (Exception e) {e.printStackTrace();} finally {executor.shutdown();}}}

关键API

方法作用
future.get()阻塞获取结果(可设置超时)
future.cancel()取消任务执行
isDone()检查任务是否完成

执行流程

  1. 提交Callable任务到线程池
  2. 主线程继续执行其他操作
  3. 调用future.get()阻塞等待结果
  4. 处理可能出现的异常情况
  5. 最终关闭线程池资源

方法四:CountDownLatch(多线程同步)

代码示例

 import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.TimeUnit;public class CountDownLatchExample {private static final int RUNNERS = 5;private static final CountDownLatch startSignal = new CountDownLatch(1);private static final CountDownLatch readySignal = new CountDownLatch(RUNNERS);public static void main(String[] args) throws InterruptedException {ExecutorService executor = Executors.newFixedThreadPool(RUNNERS);for (int i = 1; i <= RUNNERS; i++) {executor.execute(() -> {try {System.out.println("运动员" + i + "正在准备...");TimeUnit.MILLISECONDS.sleep(300);readySignal.countDown();startSignal.await();System.out.println("运动员" + i + "起跑!");TimeUnit.MILLISECONDS.sleep((long)(Math.random() * 1000));System.out.println("运动员" + i + "到达终点!");} catch (InterruptedException e) {e.printStackTrace();}});}System.out.println("裁判等待运动员就位...");readySignal.await();System.out.println("\n所有运动员就位!");TimeUnit.SECONDS.sleep(1);System.out.println("发令枪响!");startSignal.countDown();executor.shutdown();executor.awaitTermination(5, TimeUnit.SECONDS);System.out.println("\n比赛结束!");}}

应用场景

  1. 多线程初始化后统一执行:如服务启动时等待所有组件就绪
  2. 并发测试控制:模拟固定数量请求同时发起
  3. 事件驱动编程:等待多个前置条件完成

方法五:CyclicBarrier(可重用同步屏障)

代码示例

 import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {private static final CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("\n===== 进入下一阶段 ====="));public static void main(String[] args) {for (int i = 1; i <= 3; i++) {new Thread(new TeamMember(i)).start();}}static class TeamMember implements Runnable {private int id;public TeamMember(int id) {this.id = id;}@Overridepublic void run() {try {doWork("需求分析", 1000);barrier.await();doWork("开发编码", 1500);barrier.await();doWork("测试部署", 800);barrier.await();} catch (Exception e) {e.printStackTrace();}}private void doWork(String phase, int baseTime) throws InterruptedException {int time = baseTime + (int)(Math.random() * 500);System.out.printf("%s 完成%s(%dms)\n", Thread.currentThread().getName(), phase, time);Thread.sleep(time);}}}

核心特性

对比项CountDownLatchCyclicBarrier
重用性一次性使用可重复触发
线程关系主线程等待子线程子线程相互等待
典型场景线程初始化完成后执行多阶段任务协作

总结对比表

方法适用场景核心机制扩展性
wait/notify简单生产者-消费者模型对象锁的等待/通知机制
ReentrantLock+Condition需要多个条件变量精细条件控制
Future异步任务结果获取任务提交与结果回调
CountDownLatch多线程等待单一事件计数器递减触发机制
CyclicBarrier多阶段任务同步可重置的屏障计数机制

最佳实践建议

  • 简单同步场景优先使用CountDownLatch
  • 需要结果返回时使用Future
  • 多条件或多阶段场景推荐CyclicBarrier
  • 避免使用过时的Object.wait/notify直接控制
http://www.dtcms.com/wzjs/123878.html

相关文章:

  • 哈西建站优化承接网络推广外包业务
  • 潜江做网站哪家好百度咨询电话 人工
  • 网站取消备案直接下载app
  • 做分析图超牛的地图网站2021年度关键词有哪些
  • 网站页面怎么做识别二维码seo的名词解释
  • 做中学网站百度推广手机版
  • 网站做水印有没有影响吗bing搜索引擎入口
  • 想创办一个本地的人才招聘网站_如何做市场调查问卷能打开的a站
  • 北京企业做网站费用关键词优化的策略
  • php网站模板培训心得体会模板
  • 公司产品展示网站源码湖南长沙疫情最新情况
  • 做搜狗pc网站软件seo职位具体做什么
  • 制作钓鱼网站属于什么罪seo关键词排名优化怎样
  • wordpress文章双语成都市seo网站公司
  • dede学校网站模板下载新泰网站seo
  • 深圳建立网站公司南宁关键词优化公司
  • 北京哪里能学做网站优化游戏卡顿的软件
  • 旅游网站在提高用户体验方面应做哪些工作权重查询入口
  • 企业网站后台百度推广账户登陆
  • 网站建立基本流程整合营销案例
  • 网站都有后台吗星力游戏源码
  • 购买型网站建设搜索引擎优化的核心及内容
  • 贵州住房和城乡建设网站bim搜狐财经峰会
  • 杭州门户网站开发网站群发软件
  • 小型网站的建设与开发宁波seo外包
  • 网络营销效果好的网站百度seo泛解析代发排名
  • 可以看禁止访问网站的浏览器app推广员好做吗
  • 前端考什么证书含金量高seo是什么意思中文翻译
  • 代练中介网站有得做吗搜狗权重查询
  • 专业网站建设服务公司哪家好外链信息