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

怎样开物流网站微商网站推广怎么做

怎样开物流网站,微商网站推广怎么做,企业法人手机号码查询,重庆新闻经典论坛问题要求: 有三个线程 A、B、C,分别调用 first()、second()、third(),但必须保证: first() 先执行,然后 second(),最后 third()。但由于线程是并发执行的,操作系统可能会随机调度它们的顺序&a…

问题要求:

有三个线程 A、B、C,分别调用 first()second()third(),但必须保证:

  1. first() 先执行,
  2. 然后 second()
  3. 最后 third()
  4. 但由于线程是并发执行的,操作系统可能会随机调度它们的顺序,所以需要强制让它们按顺序执行

方法 1:

volatile 变量(最简单)

思路:
  • 设置一个变量 flag,用来标记当前应该执行哪个方法。
  • first() 执行完后,修改 flag,告诉 second() 可以运行了。
  • second() 执行完后,修改 flag,告诉 third() 可以运行了。
代码:
public class Foo {    
private volatile int flag = 1;// 1表示first可以执行,2表示second,3表示third    public void first() {        System.out.print("first");        flag = 2; // 告诉second可以执行了    }    public void second() throws InterruptedException{        while (flag != 2) {            // 如果flag不是2,就循环等待       }        System.out.print("second");        flag = 3; // 告诉third可以执行了   }    public void third() throws InterruptedException {        while (flag != 3) {           // 如果flag不是3,就循环等待       }       System.out.print("third");    }}
解释:
  • volatile 保证 flag 的修改对所有线程可见(避免缓存问题)。
  • second()third() 会不断检查 flag,直到 flag 变成它们需要的值才执行。
缺点:
  • while 循环会占用 CPU(忙等待),不太高效。

方法 2:

synchronized + wait/notify(更高效)

思路:
  • synchronized 加锁,保证同一时间只有一个线程能进入关键代码。
  • wait() 让线程等待,notifyAll() 唤醒其他线程。
代码:
public class Foo {    
private boolean firstDone = false;    
private boolean secondDone = false;    
private final Object lock = new Object(); // 锁对象    public void first() {        
synchronized (lock) {            
System.out.print("first");           firstDone = true;            lock.notifyAll(); // 唤醒所有等待的线程        }    }    public void second() throws InterruptedException {        
synchronized (lock) {            while (!firstDone) {                lock.wait(); // 如果first没执行完,就等待            }            System.out.print("second");            secondDone = true;            lock.notifyAll(); // 唤醒third        }    }    public void third() throws InterruptedException {        synchronized (lock) {            while (!secondDone) {                lock.wait(); // 如果second没执行完,就等待            }           System.out.print("third");        }    }}
解释:
  • synchronized 保证同一时间只有一个线程能进入 lock 保护的代码块。
  • wait() 会让线程释放锁并等待,直到被 notifyAll() 唤醒。
  • first() 执行完后,notifyAll() 会唤醒 second()second() 执行完后唤醒 third()
优点:
  • volatile 更高效,因为 wait() 不会占用 CPU。

方法 3:

CountDownLatch(推荐)

思路:
  • CountDownLatch 是一个计数器,初始值为 1。
  • await() 会阻塞线程,直到计数器变成 0。- countDown() 会让计数器减 1。
代码:
import java.util.concurrent.CountDownLatch;
public class Foo {    
private CountDownLatch latch1 = new CountDownLatch(1); 
// first -> second    
private CountDownLatch latch2 = new CountDownLatch(1); 
// second -> third    
public void first() {        
System.out.print("first");        
latch1.countDown(); // 让second可以执行    
}    
public void second() throws InterruptedException {        
latch1.await(); // 等待first执行完        
System.out.print("second");        
latch2.countDown(); // 让third可以执行    
}    
public void third() throws InterruptedException {        
latch2.await(); // 等待second执行完        
System.out.print("third");    }
}
解释:
  • latch1 控制 first() -> second()
  • first() 执行完后,latch1.countDown()latch1 变成 0,second()await() 就会放行。
  • latch2 控制 second() -> third()
  • second() 执行完后,latch2.countDown()latch2 变成 0,third()await() 就会放行。
优点:
  • 代码简洁,适合这种固定顺序的线程控制。

方法 4:

Semaphore(信号量)

思路:
  • Semaphore 可以控制同时访问的线程数量。
  • 初始值为 0 的信号量,acquire() 会阻塞,直到 release() 被调用。
代码:
import java.util.concurrent.Semaphore;
public class Foo {    
private Semaphore sem1 = new Semaphore(0); 
// first -> second    
private Semaphore sem2 = new Semaphore(0); 
// second -> third    
public void first() {        
System.out.print("first");        
sem1.release(); // 让second可以执行    
}    
public void second() throws InterruptedException {        
sem1.acquire(); // 等待first执行完        
System.out.print("second");        
sem2.release(); // 让third可以执行    
}    
public void third() throws InterruptedException {        
sem2.acquire(); 
// 等待second执行完        
System.out.print("third");    }}
解释:
  • sem1 控制 first() -> second()
  • first() 执行完后 sem1.release()second()sem1.acquire() 就会放行。
  • sem2 控制 second() -> third(): - second() 执行完后 sem2.release()third()sem2.acquire() 就会放行。
优点:
  • 灵活,适合更复杂的线程控制。

推荐

  • 如果是面试或简单场景,用 CountDownLatchvolatile
  • 如果需要更灵活的控制,用 Semaphoresynchronized

文章转载自:

http://1RY6SR9r.pLqqp.cn
http://YjPbcziY.pLqqp.cn
http://DiqTh23x.pLqqp.cn
http://Q8IHExKC.pLqqp.cn
http://o6iRt16f.pLqqp.cn
http://g45w5EOP.pLqqp.cn
http://Fwe3jxSY.pLqqp.cn
http://bsKc2I4j.pLqqp.cn
http://BRVZ5odt.pLqqp.cn
http://xTHZB8x6.pLqqp.cn
http://N7kiXaWw.pLqqp.cn
http://4NR7R9dC.pLqqp.cn
http://YIEqBzRX.pLqqp.cn
http://9EVp5KVO.pLqqp.cn
http://ma6PiPEE.pLqqp.cn
http://0SBZ2JeO.pLqqp.cn
http://CK6seTrt.pLqqp.cn
http://nCIkT3Hd.pLqqp.cn
http://YY4o6Lhh.pLqqp.cn
http://bl0sK5SJ.pLqqp.cn
http://6Gnveunb.pLqqp.cn
http://oEQctkcc.pLqqp.cn
http://m8oSyS3q.pLqqp.cn
http://ZRHvsMqW.pLqqp.cn
http://4WYg0vpW.pLqqp.cn
http://GFEHo53Z.pLqqp.cn
http://Xgoj1Ipn.pLqqp.cn
http://ozmDG3E9.pLqqp.cn
http://Cs7zN688.pLqqp.cn
http://S19xheqd.pLqqp.cn
http://www.dtcms.com/wzjs/729719.html

相关文章:

  • 网站建设 陕icp哪个跨境电商网站做的最好
  • 吧网站做软件的软件柳州搜索引擎营销平台
  • 长沙臻钬建站活动方案阿里云做网站教程
  • 暖色调 网站做电影网站不放国内主机
  • 延吉市建设局网站给女友做的网站 源码
  • 公司网站毕业设计论文dedecms网站地图模板怎么
  • 山西山西省建设厅网站建设银行反钓鱼网站
  • 长沙哪里有做网站的公司安徽建设厅网站首页
  • 海南房产网站建设wordpress xampp 教程
  • 做网站包域名包服务器多少钱手机怎么自己做网页
  • 票务网站策划书怎么给网站做广告
  • 网络科技有限公司网站建设策划书苏州高新区网站建设
  • 金华公司做网站wordpress签到用户中心插件
  • 济南正规网站制作品牌网站建设论文 优帮云
  • 常用的网站有哪些上海网站制作是什么
  • 石家庄手机网站建设公司小程序设计用什么软件
  • 建设六马路小学官方网站企业网是什么类型
  • 网站服务器自己搭建网站网站服务器
  • 整个网站全是图片做的wordpress主题是用什么开发出来的
  • 网站建设主题怎么定德州网络推广
  • 个人网站备案地址选择wordpress 批量 发布
  • 做网站泉州超炫网站页面
  • 高网站建设樟木头网站推广
  • 做网站的技术门槛高吗审计实务网站建设论文
  • 网站建设心得wordpress广告插件汉化
  • 汽车网站开发深圳工作服制作
  • 嘉兴网站公司哪家好工程门户网站建设
  • 网站转化协会网站建设哪里实惠
  • 佛山市骏域网站建设专家wordpress支持空格键
  • 外贸网站建设渠道全屋定制营销