java线程

来源:互联网 发布:四宫格拍照软件是什么 编辑:程序博客网 时间:2024/06/07 00:14

目录(?)[+]

  1. java多线程学习
  2. 一什么是线程什么是进程两者又有什么区别
  3. 二线程的状态有哪些
  4. 三线程的实现
    1. 注意当用start实现多线程的时候线程会实现并发执行也就是那个线程抢到了cpu那个就执行如果用run方法那就是线程1执行完之后才会只能线程2就不会有并发
  5. 1使用继承Thread方法实现三个线程并发
  6. 2使用Runnable接口
  7. 四线程的常用方法
    1. 1代码来验证这些方法
  8. 四线程的优先级
    1. 代码模块
    2. 结果分析优先级高提高的是占CPU的效率而非就一定谁的高就必须先执行
  9. 五线程的同步
    1. 1什么时候需要用到同步呢 就是程序的资源需要给多个线程共享的时候打个比方火车站有5张车票 三个人去抢如果没有任何管理的情况下就会出现有人付过钱了但是没有获得票的结局例如下方代码
    2. 运行结果
    3. 2所以我们就要用到同步synchronized来分配资源这样就好比有一个专门的售票员一样一手交钱一手交货 相比51中也就是在处理车票数据的时候添加一个同步锁
    4. 运行结果
    5. 3我们上面52用的是同步代码块那我们用同步方法如何实现的其实很简单只需要声明一个同步的方法即可如下
    6. 运行结果也是正确的运行只是处理同步资源的时候放在一个同步方法中去处理
  10. 六什么是死锁
    1. 七线程的生命周期
      1. 就那么多把都是最基础的想深入了解的小伙伴可以i多搜搜这方面的知识特别是线程同步多多注意

    java多线程学习


    一、什么是线程?什么是进程?两者又有什么区别?

    这里写图片描述

    二、线程的状态有哪些?

    这里写图片描述


    三、线程的实现

    这里写图片描述

    注意,当用start()实现多线程的时候,线程会实现并发执行,也就是那个线程抢到了cpu那个就执行。如果用run()方法,那就是线程1执行完之后才会只能线程2,就不会有并发。

    3.1,使用继承Thread方法,实现三个线程并发

    • 代码线程工具类实现
    <code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadUtil</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Thread</span> {</span>        <span class="hljs-keyword">public</span> String names;        <span class="hljs-keyword">public</span> <span class="hljs-title">ThreadUtil</span>(String name) {            <span class="hljs-keyword">super</span>();            names = name;        }        <span class="hljs-comment">//写一个构造方法,来接通主类</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {            <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">5</span>; i++) {                System.out.println(names+<span class="hljs-string">" :次数 "</span>+i);            }        }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul>
    • 引用类
    <code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> MyThread {    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        ThreadUtil tu1 = <span class="hljs-keyword">new</span> ThreadUtil(<span class="hljs-string">"我是线程tu1"</span>);        ThreadUtil tu2 = <span class="hljs-keyword">new</span> ThreadUtil(<span class="hljs-string">"我是线程tu2"</span>);        ThreadUtil tu3 = <span class="hljs-keyword">new</span> ThreadUtil(<span class="hljs-string">"我是线程tu3"</span>);        tu1.start();        tu2.start();        tu3.start();    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>
    • 打印结果:
      这里写图片描述

    3.2,使用Runnable接口

    • Runnable工具类
    <code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyRunnable</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Runnable</span>{</span>    <span class="hljs-keyword">public</span> String names;    <span class="hljs-keyword">public</span> <span class="hljs-title">MyRunnable</span>(String name) {        <span class="hljs-keyword">super</span>();        names = name;    }    <span class="hljs-comment">//写一个构造方法,来接通主类</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">5</span>; i++) {            System.out.println(names+<span class="hljs-string">" :次数 "</span>+i);        }    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>

    -主类引用

    <code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> MyThread {    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        MyRunnable tu1 = <span class="hljs-keyword">new</span> MyRunnable(<span class="hljs-string">"我是实现Runnable的线程tu1"</span>);        MyRunnable tu2 = <span class="hljs-keyword">new</span> MyRunnable(<span class="hljs-string">"我是实现Runnable线程tu2"</span>);        MyRunnable tu3 = <span class="hljs-keyword">new</span> MyRunnable(<span class="hljs-string">"我是实现Runnable线程tu3"</span>);        <span class="hljs-comment">//切记这里不能直接,tu1.start()。你需要创建一个Thread对象来接受我们实现的线程对象</span>        Thread tr1 = <span class="hljs-keyword">new</span> Thread(tu1);        tr1.start();        Thread tr2 = <span class="hljs-keyword">new</span> Thread(tu2);        tr2.start();        Thread tr3 = <span class="hljs-keyword">new</span> Thread(tu3);        tr3.start();    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul>
    • 运行结果:成功:
      这里写图片描述

    四、线程的常用方法

    这里写图片描述

    4.1代码来验证这些方法

    • 代码模块:
    <code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> TextRunnable{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        TextRunnables trR = <span class="hljs-keyword">new</span> TextRunnables(<span class="hljs-string">"线程名称"</span>);        Thread td1 = <span class="hljs-keyword">new</span> Thread(trR);        <span class="hljs-comment">//来验证是否启动状态</span>        System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"线程的状态1:"</span>+td1.isAlive());        td1.start();        System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"线程的状态2:"</span>+td1.isAlive());        <span class="hljs-comment">//下面代码含义在于测试线程的join()强制执行的方法    </span>        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">20</span>; i++) {            <span class="hljs-comment">//在主线程写一个循环,执行20次,然后当主线程执行到10的时候,强制执行子线程。如下</span>            <span class="hljs-keyword">if</span> (i==<span class="hljs-number">10</span>) {                <span class="hljs-keyword">try</span> {                    td1.<span class="hljs-keyword">join</span>();                } <span class="hljs-keyword">catch</span> (InterruptedException e) {                    <span class="hljs-comment">// TODO Auto-generated catch block</span>                    e.printStackTrace();                }            }            System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"主线程:"</span>+i);        }    }    <span class="hljs-keyword">static</span> class TextRunnables implements Runnable{            <span class="hljs-keyword">public</span> String names;            <span class="hljs-keyword">public</span> <span class="hljs-title">TextRunnables</span>(String name) {                names = name;            }            <span class="hljs-comment">//写一个构造方法,来接通主类</span>            @Override            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {                <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">5</span>; i++) {                    <span class="hljs-comment">//获取线程的名称</span>                    System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"线程名称: "</span>+Thread.currentThread().getName());                }            }     }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li></ul>
    • 1、获取线程的名称
    <code class="hljs avrasm has-numbering">`System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string">"线程名称: "</span>+Thread<span class="hljs-preprocessor">.currentThread</span>()<span class="hljs-preprocessor">.getName</span>())<span class="hljs-comment">;</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li></ul>
    • 2、判断线程是否启动
    <code class="hljs cs has-numbering">TextRunnables trR = <span class="hljs-keyword">new</span> TextRunnables(<span class="hljs-string">"线程名称"</span>);        Thread td1 = <span class="hljs-keyword">new</span> Thread(trR);        <span class="hljs-comment">//来验证是否启动状态</span>        System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"线程的状态1:"</span>+td1.isAlive());<span class="hljs-comment">//打印是未启动</span>        td1.start();        System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"线程的状态2:"</span>+td1.isAlive());<span class="hljs-comment">//打印已经未启动</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>
    • 3、验证强制开启子线程join()方法
    <code class="hljs cs has-numbering"><span class="hljs-comment">//下面代码含义在于测试线程的join()强制执行的方法    </span>        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">20</span>; i++) {            <span class="hljs-comment">//在主线程写一个循环,执行20次,然后当主线程执行到10的时候,强制执行子线程。如下</span>            <span class="hljs-keyword">if</span> (i==<span class="hljs-number">10</span>) {                <span class="hljs-keyword">try</span> {                    td1.<span class="hljs-keyword">join</span>();                } <span class="hljs-keyword">catch</span> (InterruptedException e) {                    <span class="hljs-comment">// TODO Auto-generated catch block</span>                    e.printStackTrace();                }            }            System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"主线程:"</span>+i);        }    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>
    • 剩下的还有睡眠sleep(),还有一个礼让方法yieid()方法,这里就不说了。 -

    四、线程的优先级

    这里写图片描述

    代码模块

    <code class="hljs http has-numbering"><span class="axapta"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyRunnable02</span> {</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args) {         <span class="hljs-comment">//然后我们创建三个线程。来引用线程的优先级</span>         Thread t1 = <span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> TextRunnables(),<span class="hljs-string">"A"</span>);         Thread t2 = <span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> TextRunnables(),<span class="hljs-string">"B"</span>);         Thread t3 = <span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> TextRunnables(),<span class="hljs-string">"C"</span>);         <span class="hljs-comment">//设置优先级</span>         t1.setPriority(Thread.MAX_PRIORITY);         t2.setPriority(Thread.MIN_PRIORITY);         t3.setPriority(Thread.NORM_PRIORITY);         <span class="hljs-comment">//开启线程</span>         t1.start();         t2.start();         t3.start();        }        <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TextRunnables</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Runnable</span>{</span>                <span class="hljs-comment">//写一个构造方法,来接通主类</span>                @Override                <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run() {                    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">5</span>; i++) {                        <span class="hljs-comment">//获取线程的名称</span>                        <span class="hljs-keyword">try</span> {                            Thread.sleep(<span class="hljs-number">1000</span>);                            System.out.println(<span class="hljs-string">"线程名称: "</span>+Thread.currentThread().getName()+i);                        } <span class="hljs-keyword">catch</span> (InterruptedException e) {                            <span class="hljs-comment">// TODO Auto-generated catch block</span>                            e.printStackTrace();                        }                    }                }         }    }</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li></ul>

    结果分析:优先级高,提高的是占CPU的效率,而非就一定谁的高就必须先执行


    • 这里写图片描述

    五、线程的同步

    这里写图片描述

    5.1:什么时候需要用到同步呢? 就是程序的资源需要给多个线程共享的时候,打个比方,火车站有5张车票 ,三个人去抢。如果没有任何管理的情况下,就会出现有人付过钱了但是没有获得票的结局。例如下方代码

    <code class="hljs axapta has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyRunnable02</span> {</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args) {         <span class="hljs-comment">//然后我们创建三个线程。来引用线程的优先级</span>         TextRunnables fRunnables = <span class="hljs-keyword">new</span> TextRunnables();         Thread t1 = <span class="hljs-keyword">new</span> Thread(fRunnables);         Thread t2 = <span class="hljs-keyword">new</span> Thread(fRunnables);         Thread t3 = <span class="hljs-keyword">new</span> Thread(fRunnables);         <span class="hljs-comment">//开启线程</span>         t1.start();         t2.start();         t3.start();        }        <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TextRunnables</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Runnable</span>{</span>                <span class="hljs-comment">//假设有五张牌</span>                <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> ticket = <span class="hljs-number">5</span>;                @Override                <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run() {                        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">10</span>; i++) {                            <span class="hljs-comment">//如果还有票就继续抢</span>                            <span class="hljs-keyword">if</span>(ticket><span class="hljs-number">0</span>){                            <span class="hljs-comment">//获取线程的名称</span>                            <span class="hljs-keyword">try</span> {                                <span class="hljs-comment">//睡眠500毫秒抢一次</span>                                Thread.sleep(<span class="hljs-number">500</span>);                              } <span class="hljs-keyword">catch</span> (InterruptedException e) {                                <span class="hljs-comment">// TODO Auto-generated catch block</span>                                e.printStackTrace();                            }                            <span class="hljs-comment">//如果被抢走,就减少一张票数量</span>                            System.out.println(<span class="hljs-string">"车票剩余: "</span>+ticket--);                        }                    }                }         }    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul>

    运行结果

    这里写图片描述

    5.2:所以我们就要用到同步(synchronized)来分配资源,这样就好比有一个专门的售票员一样,一手交钱一手交货, 相比5.1中,也就是在处理车票数据的时候添加一个同步锁

    <code class="hljs http has-numbering"><span class="axapta"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyRunnable02</span> {</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args) {         <span class="hljs-comment">//然后我们创建三个线程。来引用线程的优先级</span>         TextRunnables fRunnables = <span class="hljs-keyword">new</span> TextRunnables();         Thread t1 = <span class="hljs-keyword">new</span> Thread(fRunnables);         Thread t2 = <span class="hljs-keyword">new</span> Thread(fRunnables);         Thread t3 = <span class="hljs-keyword">new</span> Thread(fRunnables);         <span class="hljs-comment">//开启线程</span>         t1.start();         t2.start();         t3.start();        }        <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TextRunnables</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Runnable</span>{</span>                <span class="hljs-comment">//假设有五张牌</span>                <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> ticket = <span class="hljs-number">5</span>;                @Override                <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run() {                    <span class="hljs-comment">//加一个同步代码块,这样就可以合理的分配资源,不会出现cpu抢占资源问题</span>                    synchronized (<span class="hljs-keyword">this</span>) {                        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">10</span>; i++) {                            <span class="hljs-comment">//如果还有票就继续抢</span>                            <span class="hljs-keyword">if</span>(ticket><span class="hljs-number">0</span>){                            <span class="hljs-comment">//获取线程的名称</span>                            <span class="hljs-keyword">try</span> {                                <span class="hljs-comment">//睡眠500毫秒抢一次</span>                                Thread.sleep(<span class="hljs-number">500</span>);                              } <span class="hljs-keyword">catch</span> (InterruptedException e) {                                <span class="hljs-comment">// TODO Auto-generated catch block</span>                                e.printStackTrace();                            }                            <span class="hljs-comment">//如果被抢走,就减少一张票数量</span>                            System.out.println(<span class="hljs-string">"车票剩余: "</span>+ticket--);                        }                    }                    }                }         }    }</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li></ul>

    运行结果

    这里写图片描述


    5.3:我们上面5.2用的是同步代码块,那我们用同步方法如何实现的,其实很简单,只需要声明一个同步的方法即可。如下:

    <code class="hljs axapta has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyRunnable02</span> {</span>     <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args) {         <span class="hljs-comment">//然后我们创建三个线程。来引用线程的优先级</span>         TextRunnables fRunnables = <span class="hljs-keyword">new</span> TextRunnables();         Thread t1 = <span class="hljs-keyword">new</span> Thread(fRunnables);         Thread t2 = <span class="hljs-keyword">new</span> Thread(fRunnables);         Thread t3 = <span class="hljs-keyword">new</span> Thread(fRunnables);         <span class="hljs-comment">//开启线程</span>         t1.start();         t2.start();         t3.start();        }        <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TextRunnables</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Runnable</span>{</span>                <span class="hljs-comment">//假设有五张牌</span>                <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> ticket = <span class="hljs-number">5</span>;                @Override                <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run() {                    <span class="hljs-comment">//直接调用同步方法即可</span>                     tell();                }                <span class="hljs-comment">//写一个同步的方法</span>                <span class="hljs-keyword">public</span> synchronized <span class="hljs-keyword">void</span> tell(){                    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">10</span>; i++) {                        <span class="hljs-comment">//如果还有票就继续抢</span>                        <span class="hljs-keyword">if</span>(ticket><span class="hljs-number">0</span>){                        <span class="hljs-comment">//获取线程的名称</span>                        <span class="hljs-keyword">try</span> {                            <span class="hljs-comment">//睡眠500毫秒抢一次</span>                            Thread.sleep(<span class="hljs-number">500</span>);                          } <span class="hljs-keyword">catch</span> (InterruptedException e) {                            <span class="hljs-comment">// TODO Auto-generated catch block</span>                            e.printStackTrace();                        }                        <span class="hljs-comment">//如果被抢走,就减少一张票数量</span>                        System.out.println(<span class="hljs-string">"车票剩余: "</span>+ticket--);                    }                }                }         }    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul>

    运行结果:也是正确的运行,只是处理同步资源的时候,放在一个同步方法中去处理

    这里写图片描述


    六、什么是死锁?

    打个比方,一对情侣,女方必须要求南方在北京买一套3000万的房子,男子缺必须在老家买个30万的别墅。两个人就开始相互争执,这就造成了问题的无法解决,就可以理解为死锁。解决的办法,就是双方的某一方,降低自己的要求,能使两者都接受就可以了。

    七、线程的生命周期?

    这里写图片描述

    就那么多把。都是最基础的。想深入了解的小伙伴可以i多搜搜这方面的知识!特别是线程同步多多注意

    0 0