Java中的多线程

论坛 期权论坛     
选择匿名的用户   2021-5-30 03:14   407   0
<div>
<div>
  <h2>引</h2>
  <p>如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。</p>
  <p>用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。</p>
  <p>很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。</p>
  <ul><li>多线程:指的是这个程序(一个进程)运行时产生了不止一个线程</li><li>并行与并发:</li><li>并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。</li><li>并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。</li></ul>
  <div class="image-package">
   <div class="image-container" style="max-width:496px;max-height:503px;background-color:transparent;">
    <div class="image-view">
     <img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-4d52daabd8929e077715695f0bdc595e.png">
    </div>
   </div>
   <div class="image-caption">
    并发与并行
   </div>
  </div>
  <ul><li>线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码:</li></ul>
  <pre class="blockcode"><code class="language-javascript"><code class="javascript"><span class="hljs-keyword">void</span> transferMoney(User <span class="hljs-keyword">from</span>, User to, float amount){
    to.setMoney(to.getBalance() &#43; amount);
    <span class="hljs-keyword">from</span>.setMoney(<span class="hljs-keyword">from</span>.getBalance() - amount);
}
</code></code></pre>
  <ul><li>同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面的代码简单加入<code>&#64;synchronized</code>关键字。在保证结果准确的同时,提高性能,才是优秀的程序。线程安全的优先级高于性能。</li></ul>
  <p>好了,让我们开始吧。我准备分成几部分来总结涉及到多线程的内容:</p>
  <ol><li>扎好马步:线程的状态</li><li>内功心法:每个对象都有的方法(机制)</li><li>太祖长拳:基本线程类</li><li>九阴真经:高级多线程控制类</li></ol>
  <h2>扎好马步:线程的状态</h2>
  <p>先来两张图:</p>
  <br>
  <div class="image-package">
   <div class="image-container" style="max-width:700px;max-height:548px;background-color:transparent;">
    <div class="image-view">
     <img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-cf85920b07e84e36550b285e7da21e32.png">
    </div>
   </div>
   <div class="image-caption">
    线程状态
   </div>
  </div>
  <div class="image-package">
   <div class="image-container" style="max-width:700px;max-height:308px;background-color:transparent;">
    <div class="image-view">
     <img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-a8117d67673e5b155ddcf8dd6fc55582.png">
    </div>
   </div>
   <div class="image-caption">
    线程状态转换
   </div>
  </div>
  <p>各种状态一目了然,值得一提的是&#34;Blocked&#34;和&#34;Waiting&#34;这两个状态的区别:</p>
  <ul><li><p>线程在Running的过程中可能会遇到阻塞(Blocked)情况<br>对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。从jdk源码注释来看,blocked指的是对monitor的等待(可以参考下文的图)即该线程位于等待区。</p></li><li><p>线程在Running的过程中可能会遇到等待(Waiting)情况<br>线程可以主动调用object.wait或者sleep,或者join(join内部调用的是sleep,所以可看成sleep的一种)进入。从jdk源码注释来看,waiting是等待另一个线程完成某一个操作,如join等待另一个完成执行,object.wait()等待object.notify()方法执行。</p></li></ul>
  <blockquote>
   <p><strong>Waiting状态和Blocked状态</strong>有点费解,我个人的理解是:Blocked其实也是一种wait,等待的是monitor,但是和Waiting状态不一样,举个例子,有三个线程进入了同步
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP