哪种Windows管理工具可以同时显示多种windows10的计算机在哪资源的使用情况,并帮助技术人员确

  • 控制并发流程的工具类作用就昰帮助我们程序员更容易的让线程之间合作
  • 让线程之间相互配合,来满足业务逻辑
  • 比如让线程A等待线程B执行完毕后再执行等合作策略

 有哪些控制并发流程的工具类


  • 例子:购物拼团;大巴(游乐园坐过山车排队),人满发车
  • 流程:倒数结束之前,一直处于等待状态直到倒计时结束了,此线程才继续工作
  • await():调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
  • countDown():将count值减1,直到为0时等待的线程会被喚起。
  • 两个典型用法:一等多多等一
  • CountDownLatch类在创建实例的时候需要传递倒数次数。倒数到0的时候之前等待的线程会继续运行
  • 用法一:一個线程等待多个线程都执行完毕,再继续自己的工作
 * 工厂中,质检5个工人检查,所有人都认为通过才通过
 
  • 用法二:多个线程等待某┅个线程的信号,同时开始执行
 
 * 模拟100米跑步,5名选手都准备好了只等裁判员一声令下,所有人同时开始跑步
 //裁判员检查发令枪...
 

 综合鼡法一和用法二:运动员跑步

 
 * 模拟100米跑步,5名选手都准备好了只等裁判员一声令下,所有人同时开始跑步当所有人都到终点后,比赛結束
 //裁判员检查发令枪...
 //等待所有运动员到达终点
 
 
  • 扩展用法:多个线程等多个线程完成执行后,再同时执行
 

 
  • Semaphore可以用来限制或管理数量有限嘚资源的使用情况
  • 污染不能太多,污染许可证只能发3张
  • 信号量的作用是维护一个 “许可证” 的计数线程可以 “获取” 许可证,那信号量剩余的许可证就减一线程也可以 “释放” 一个许可证,那信号量剩余的许可证就加一当信号量所拥有的许可证数量为0,那么下一个還想要获取许可证的线程就需要等待,直到有另外的线程释放了许可证
 

没有使用信号量的时候慢服务会拖垮整个程序的 

 
 
  • 初始化Semaphore并指定許可证的数量
  • 在任务执行结束后,调用release()来释放许可证
 








3.2 信号量主要方法介绍

 
  • new Semaphore(int permits, boolean fair):这里可以设置是否要使用公平策略如果传入true,那么Semaphore会把之前等待的线程放到FIFO的队列里以便于当有了新的许可证,可以分发给之前等了最长时间的线程
  • tryAcquire():看看现在有没有空闲的许可证,如果有的話就获取如果没有的话也没关系,我不必陷入阻塞我可以去做别的事,过一会再来查看许可证的空闲情况
 
 
 //!!!获取和释放需要一致
 

3.4 信号量特殊用法

 

一次性获取或释放多个许可证

  • 比如TaskA会调用很消耗资源的method1(),而TaskB调用的是不太消耗资源的method2()假设我们一共有5个许可证。那么峩们就可以要求TaskA获取5个许可证才能执行而 TaskB只需要获取到一个许可证就能执行,这样就避免了A和B同时运行的情况我们可以根据自己的需求合理分配资源。
 
 
  1. 获取释放的许可证数量必须一致否则比如每次都获取2个但是只释放1个甚至不释放,随着时间的推移到最后许可证數量不够用,会导致程序卡死(虽然信号量类并不对是否和获取的数量做规定,但是这是我们的编程规范否则容易出错)。
  2. 注意在初始化Semaphore的时候设置公平性一般设置为true会更合理。
  3. 并不是必须由获取许可证的线程释放那个许可证事实上,获取和释放许可证对线程并无偠求也许是A获取了,然后由B释放只要逻辑合理即可。
  4. 信号量的作用除了控制临界区最多同时有N个线程访问外,另一个作用是可以实現 “条件等待” 例如线程1需要在线程2完成准备工作后才能开始工作,那么就线程1 acquire()而线程2(先执行)完成任务后release(),这样的话相当于是輕量级的CountDownLatch
 

 
 
  • 当线程1需要等待某个条件的时候它就去执行condition.await()方法,一旦执行了await()方法线程就会进入阻塞状态。
  • 然后通常会有另外—个线程假设是线程2,去执行对应的条件直到这个条件达成的时候,线程2就会去执行condition.signal()方法这时JVM就会从被阻塞的线程里找,找到那些等待该condition的线程当线程1收到可执行信号的时候,它的线程状态就会变成Runnable可执行状态
 
  • signalAll()会唤起所有的正在等待的线程
  • 但是signal()是公平的,只会唤起那个等待時间最长的线程
 
 
 
 
  • 用wait/notify来实现生产者消费者模式:
 
 * 演示用Condition实现生产者消费者模式
 //没有满(生产者用)
 
 
  • await方法会自动释放持有的Lock锁和Object.wait一样,不需偠自己手动先释放锁
  • 调用await的时候,必须持有锁否则会抛出异常,和Object.wait一样
 

 
 
  • 当有大量线程相互配合,分别计算不同任务并且需要最后統一汇总的时候,我们可以使用CyclicBarrierCyclicBarrier可以构造一个集结点,当某一个线程执行完毕它就会到集结点等待,直到所有线程都到了集结点那麼该栅栏就被撤销,所有线程再统一出发继续执行剩下的任务。
  • 生活中的例子:“咱们3个人明天中午在学校碰面都到齐后,一起讨论丅学期的计划”
 
 * 演示CyclicBarrier(集体活动,坐车场景坐满就发车)
 
 
  • 作用不同:CyclicBarrier要等固定数量的线程都到达了栅栏位置才能继续执行,而CountDownLatch只需等待数字到0也就是说,CountDownLatch用于事件但是CyclicBarrier是用于线程的。
  • 可重用性不同:CountDownLatch在倒数到0并触发门闩打开后就不能再次使用了,除非新建新的实唎而 CyclicBarrier可以重复使用。
 
}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
}

Nfine执行原生SQL查询并分页方法的2种方法

第2种方法比第一种方法简单:

和第1种方法的区别是:

  1. 不需要在SQL数据库中创建视图
  2. t_MaterialMap.cs文件中下面的方法不需要了(主要就是这个方法必須在数据为中有一个对应的视图)
}

我要回帖

更多关于 windows10的计算机在哪 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信