全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java多线程的调度_动力节点Java学院整理

有多个线程,如何控制它们执行的先后次序?

        方法一:设置线程优先级。

        java.lang.Thread 提供了 setPriority(int newPriority) 方法来设置线程的优先级,但线程的优先级是无法保障线程的执行次序的,优先级只是提高了优先级高的线程获取 CPU 资源的概率。也就是说,这个方法不靠谱。

        方法二:使用线程合并。

        使用 java.lang.Thread 的 join() 方法。比如有线程 a,现在当前线程想等待 a 执行完之后再往下执行,那就可以使用 a.join()。一旦线程使用了 a.join(),那么当前线程会一直等待 a 消亡之后才会继续执行。什么时候 a 消亡?a 的 run() 方法执行结束了 a 就消亡了。

        这个方法可以有效地进行线程调度,但却只能局限于等待一个线程的执行调度。如果要等待 N 个线程的话,显然是无能为力了。而且等待线程必须在被等待线程消亡后才得到继续执行的指令,无法做到两个线程真正意义上的并发,灵活性较差。

        方法三:使用线程通信。

        java.lang.Object 提供了可以进行线程间通信的 wait 与 notify 、notifyAll 等方法。每个 Java 对象都有一个隐性的线程锁的概念,通过这个线程锁的概念我们让线程间可以进行通信,各线程不再埋头单干。著名的“生产者-消费者”模型就是基于这个原理实现的。

        这个方法也可以有效地进行线程调度,而且也不仅仅局限于等待一个线程的执行调度,具有很大程度上的灵活性。但操作复杂,不易控制容易造成混乱,程序维护起来也不太方便。

        方法四:使用闭锁。

        闭锁就像一扇门,在先决条件未达成之前这扇门是闭着的,线程无法通过,先决条件达成之后,闭锁打开,线程就可以继续执行了。java.util.concurrent.CountDownLatch 是一个很实用的闭锁实现,它提供了 countDown() 和 await() 方法达成线程执行队列,这个方法最适合 M 个线程等待 N 个线程执行结束再执行的情况。首先初始化一个 CountDownLatch 对象,比如 CountDownLatch doneSignal = new CountDownLatch(N);该对象具有 N 作为计数阀值,每个被等待线程通过对 doneSignal 对象的持有,使用 countDown() 可以将 doneSignal 的计数阀值减一;每个等待线程通过对 doneSignal 对象的持有,使用 await() 阻塞当前线程,直到 doneSignal 计数阀值减为 0,才继续往下执行。

        这个方法也可以有效地进行线程调度,而且比方法三更易于管理,开发者只需控制好 CountDownLatch 即可。但线程执行次序管理相对单一,它只是指出当前等待线程的数量,而且 CountDownLatch 的初始阀值一旦设置就只能递减下去,无法重置。如需递减过程中进行阀值的重置可以参考 java.util.concurrent.CyclicBarrier。

        不管如何,CountDownLatch 对于一定条件下的线程队列的达成还是很有用的。对于复杂环境下的线程管理还是卓有成效的。所以熟悉和把握对它的使用还是很有必要的。

        以下是一个实际项目中 CountDownLatch 的使用的例子:

 private Map<Long,DecryptSignalAndPath> afterDecryptFilePathMap = new HashMap<Long,DecryptSignalAndPath>();//TODO 注意容器垃圾数据的清理工作 
 class DecryptRunnable implements Runnable { 
   private ServerFileBean serverFile; 
   private Long fid;//指向解密文件 
   private CountDownLatch decryptSignal; 
   protected DecryptRunnable(Long fid, ServerFileBean serverFile, CountDownLatch decryptSignal) { 
     this.fid = fid; 
     this.serverFile = serverFile; 
     this.decryptSignal = decryptSignal; 
   } 
   @Override 
   public void run() { 
     //开始解密 
     String afterDecryptFilePath = null; 
     DecryptSignalAndPath decryptSignalAndPath = new DecryptSignalAndPath(); 
     decryptSignalAndPath.setDecryptSignal(decryptSignal); 
     afterDecryptFilePathMap.put(fid, decryptSignalAndPath); 
     afterDecryptFilePath = decryptFile(serverFile); 
     decryptSignalAndPath.setAfterDecryptFilePath(afterDecryptFilePath); 
     decryptSignal.countDown();//通知所有阻塞的线程 
   } 
    
 } 
 class DecryptSignalAndPath { 
   private String afterDecryptFilePath; 
   private CountDownLatch decryptSignal; 
   public String getAfterDecryptFilePath() { 
     return afterDecryptFilePath; 
   } 
   public void setAfterDecryptFilePath(String afterDecryptFilePath) { 
     this.afterDecryptFilePath = afterDecryptFilePath; 
   } 
   public CountDownLatch getDecryptSignal() { 
     return decryptSignal; 
   } 
   public void setDecryptSignal(CountDownLatch decryptSignal) { 
     this.decryptSignal = decryptSignal; 
   } 
 } 

        需要先执行的,被等待线程在这里加入:

 CountDownLatch decryptSignal = new CountDownLatch(1); 
 new Thread(new DecryptRunnable(fid, serverFile, decryptSignal)).start();//无需拿到新线程句柄,由 CountDownLatch 自行跟踪 
 try { 
   decryptSignal.await(); 
 } catch (InterruptedException e) { 
   // TODO Auto-generated catch block 
 } 

        需要后执行,等待的线程可以这样加入:

CountDownLatch decryptSignal = afterDecryptFilePathMap.get(fid).getDecryptSignal();   
 try { 
   decryptSignal.await(); 
 } catch (InterruptedException e) { 
   // TODO Auto-generated catch block 
 } 

        当然,这也仅仅只是一个简单的 CountDownLatch 的使用展示,对于 CountDownLatch 来说有点大材小用了,因为它可以胜任更复杂的多线程环境。示例中的案例完全可以使用线程通信进行搞定。因为 CountDownLatch 的阀值初始为 1,所以这里甚至完全可以使用方法二所说的线程的合并进行取代。

        如果读者觉得以上示例不够清晰,也可以参考 JDK API 提供的 demo,这个清晰明了:

 class Driver2 { // ... 
  void main() throws InterruptedException { 
   CountDownLatch doneSignal = new CountDownLatch(N); 
   Executor e = ... 
  
   for (int i = 0; i < N; ++i) // create and start threads 
    e.execute(new WorkerRunnable(doneSignal, i)); 
  
   doneSignal.await();      // wait for all to finish 
  } 
 } 
  
 class WorkerRunnable implements Runnable { 
  private final CountDownLatch doneSignal; 
  private final int i; 
  WorkerRunnable(CountDownLatch doneSignal, int i) { 
   this.doneSignal = doneSignal; 
   this.i = i; 
  } 
  public void run() { 
   try { 
    doWork(i); 
    doneSignal.countDown(); 
   } catch (InterruptedException ex) {} // return; 
  } 
  
  void doWork() { ... } 
 } 

以上所述是小编给大家介绍的Java多线程的调度,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # 多线程调度  # 详解Java中的线程模型与线程调度  # Java线程调度之线程休眠用法分析  # Java 线程的优先级(setPriority)案例详解  # Java多线程与优先级详细解读  # java线程优先级原理详解  # Java线程的调度与优先级详解  # 有效地  # 是一个  # 也不  # 可以使用  # 小编  # 多线程  # 局限于  # 都有  # 大材小用  # 在这里  # 就像  # 那就  # 多个  # 在此  # 句柄  # 什么时候  # 才会  # 很有  # 只需  # 卓有成效 


相关文章: 如何在搬瓦工VPS快速搭建网站?  魔方云NAT建站如何实现端口转发?  如何快速建站并高效导出源代码?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在阿里云高效完成企业建站全流程?  建站之星后台密码如何安全设置与找回?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  电商网站制作价格怎么算,网上拍卖流程以及规则?  常州自助建站工具推荐:低成本搭建与模板选择技巧  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  建站之星伪静态规则如何正确配置?  建站之星安装模板失败:服务器环境不兼容?  如何在Windows 2008云服务器安全搭建网站?  如何通过虚拟主机快速搭建个人网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  已有域名和空间如何搭建网站?  如何在IIS中新建站点并解决端口绑定冲突?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  建站之星导航如何优化提升用户体验?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  已有域名和空间,如何快速搭建网站?  如何制作算命网站,怎么注册算命网站?  如何高效生成建站之星成品网站源码?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  c# await 一个已经完成的Task会发生什么  黑客入侵网站服务器的常见手法有哪些?  湖北网站制作公司有哪些,湖北清能集团官网?  建站主机选购指南:核心配置优化与品牌推荐方案  教学论文网站制作软件有哪些,写论文用什么软件 ?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何基于云服务器快速搭建网站及云盘系统?  广州商城建站系统开发成本与周期如何控制?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站之星如何通过成品分离优化网站效率?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  网站制作报价单模板图片,小松挖机官方网站报价?  如何在腾讯云免费申请建站?  如何在企业微信快速生成手机电脑官网?  制作销售网站教学视频,销售网站有哪些?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  网站制作说明怎么写,简述网页设计的流程并说明原因?  python的本地网站制作,如何创建本地站点?  高防服务器如何保障网站安全无虞? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。