<h1>一,进程和线程基本概念</h1> <h2>进程  </h2> <ul> <li class="md-end-block md-p md-focus"><span style="color: rgba(255, 0, 0, 1)"><strong><span class="md-plain md-expand">是正在运行的程序</span></strong></span></li> <li class="md-end-block md-p"><strong><span class="md-tab"> <span class="md-plain">是系统进行资源分配和调用的独立单位</span></span></strong></li> <li class="md-end-block md-p md-focus"><strong><span class="md-tab"> <span class="md-plain md-expand">每一个进程都有它自己的内存空间和系统资源</span></span></strong></li> </ul> <h2>线程</h2> <ul> <li class="md-end-block md-p md-focus"><span style="color: rgba(255, 0, 0, 1)"><strong><span class="md-plain md-expand">是进程中的单个顺序控制流,是一条执行路径</span></strong></span></li> <li class="md-end-block md-p"><strong><span class="md-tab"> <span class="md-plain">单线程:一个进程如果只有一条执行路径,则称为单线程程序</span></span></strong></li> <li class="md-end-block md-p md-focus"><strong><span class="md-tab"> <span class="md-plain md-expand">多线程:一个进程如果有多条执行路径,则称为多线程程序</span></span></strong></li> </ul> <h1>二,线程详解</h1> <h2>2.1 <span class="md-plain md-expand">实现多线程</span></h2> <h3><span class="md-plain md-expand">方式一:继承Thread类</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item md-focus-container"> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">方法介绍</span></p> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void run()</span></span></td> <td><span class="td-span"><span class="md-plain">在线程开启后,此方法将被调用执行</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void start()</span></span></td> <td><span class="td-span"><span class="md-plain">使此线程开始执行,Java虚拟机会调用run方法()</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">定义一个类MyThread继承Thread类</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">在MyThread类中重写run()方法</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">创建MyThread类的对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">启动线程</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">MyThread <span class="cm-keyword">extends <span class="cm-variable">Thread {<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for(<span class="cm-variable-3">int <span class="cm-variable">i<span class="cm-operator">=<span class="cm-number">0; <span class="cm-variable">i<span class="cm-operator">&lt;<span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">MyThreadDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyThread <span class="cm-variable">my1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyThread();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyThread <span class="cm-variable">my2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyThread();<br><span><span>​<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; my1.run();<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; my2.run();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">my1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">my2.<span class="cm-variable">start();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">两个小问题</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">为什么要重写run()方法?</span></p> <p class="md-end-block md-p"><span class="md-plain">因为run()是用来封装被线程执行的代码</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">run()方法和start()方法的区别?</span></p> <p class="md-end-block md-p"><span class="md-plain">run():封装线程执行的代码,直接调用,相当于普通方法的调用</span></p> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">start():启动线程;然后由JVM调用此线程的run()方法</span></p> </li> </ul> </li> </ul> <h3><span class="md-plain md-expand">方式二:</span><span class="md-plain md-expand">实现Runnable接口</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item md-focus-container"> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">Thread构造方法</span></p> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">Thread(Runnable target)</span></span></td> <td><span class="td-span"><span class="md-plain">分配一个新的Thread对象</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">Thread(Runnable target, String name)</span></span></td> <td><span class="td-span"><span class="md-plain">分配一个新的Thread对象</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">定义一个类MyRunnable实现Runnable接口</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">在MyRunnable类中重写run()方法</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">创建MyRunnable类的对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">创建Thread类的对象,把MyRunnable对象作为构造方法的参数</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">启动线程</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">MyRunnable <span class="cm-keyword">implements <span class="cm-variable">Runnable {<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for(<span class="cm-variable-3">int <span class="cm-variable">i<span class="cm-operator">=<span class="cm-number">0; <span class="cm-variable">i<span class="cm-operator">&lt;<span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Thread.<span class="cm-variable">currentThread().<span class="cm-variable">getName()<span class="cm-operator">+<span class="cm-string">":"<span class="cm-operator">+<span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">MyRunnableDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//创建MyRunnable类的对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyRunnable <span class="cm-variable">my <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyRunnable();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//创建Thread类的对象,把MyRunnable对象作为构造方法的参数<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Thread(Runnable target)<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; Thread t1 = new Thread(my);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; Thread t2 = new Thread(my);<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Thread(Runnable target, String name)<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Thread <span class="cm-variable">t1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">Thread(<span class="cm-variable">my,<span class="cm-string">"高铁");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Thread <span class="cm-variable">t2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">Thread(<span class="cm-variable">my,<span class="cm-string">"飞机");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//启动线程<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">t1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">t2.<span class="cm-variable">start();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">相比继承Thread类,实现Runnable接口的好处</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">避免了Java单继承的局限性</span></p> </li> <li class="md-list-item md-focus-container"> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想</span></p> </li> </ul> </li> </ul> <h2>2.2 设置线程和获取线程</h2> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain md-expand">方法介绍</span></p> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void setName(String name)</span></span></td> <td><span class="td-span"><span class="md-plain">将此线程的名称更改为等于参数name</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">String getName()</span></span></td> <td><span class="td-span"><span class="md-plain">返回此线程的名称</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">Thread currentThread()</span></span></td> <td><span class="td-span"><span class="md-plain">返回对当前正在执行的线程对象的引用</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">MyThread <span class="cm-keyword">extends <span class="cm-variable">Thread {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable">MyThread() {}<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable">MyThread(<span class="cm-variable-3">String <span class="cm-variable">name) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">super(<span class="cm-variable">name);<br><span> &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable-3">int <span class="cm-variable">i <span class="cm-operator">= <span class="cm-number">0; <span class="cm-variable">i <span class="cm-operator">&lt; <span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">getName()<span class="cm-operator">+<span class="cm-string">":"<span class="cm-operator">+<span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">MyThreadDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyThread <span class="cm-variable">my1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyThread();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyThread <span class="cm-variable">my2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyThread();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void setName(String name):将此线程的名称更改为等于参数 name<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">my1.<span class="cm-variable">setName(<span class="cm-string">"高铁");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">my2.<span class="cm-variable">setName(<span class="cm-string">"飞机");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Thread(String name)<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyThread <span class="cm-variable">my1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyThread(<span class="cm-string">"高铁");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MyThread <span class="cm-variable">my2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">MyThread(<span class="cm-string">"飞机");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">my1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">my2.<span class="cm-variable">start();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//static Thread currentThread() 返回对当前正在执行的线程对象的引用<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Thread.<span class="cm-variable">currentThread().<span class="cm-variable">getName());<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h2>2.3 线程优先级</h2> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">线程调度</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain md-expand">两种调度方式</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">Java使用的是抢占式调度模型</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">随机性</span></p> <p class="md-end-block md-p"><span class="md-plain">假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">优先级相关方法</span></p> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">final int getPriority()</span></span></td> <td><span class="td-span"><span class="md-plain">返回此线程的优先级</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">final void setPriority(int newPriority)</span></span></td> <td><span class="td-span"><span class="md-plain">更改此线程的优先级 线程默认优先级是5;线程优先级的范围是:1-10</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadPriority <span class="cm-keyword">extends <span class="cm-variable">Thread {<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable-3">int <span class="cm-variable">i <span class="cm-operator">= <span class="cm-number">0; <span class="cm-variable">i <span class="cm-operator">&lt; <span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">getName() <span class="cm-operator">+ <span class="cm-string">":" <span class="cm-operator">+ <span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadPriorityDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadPriority <span class="cm-variable">tp1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadPriority();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadPriority <span class="cm-variable">tp2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadPriority();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadPriority <span class="cm-variable">tp3 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadPriority();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp1.<span class="cm-variable">setName(<span class="cm-string">"高铁");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp2.<span class="cm-variable">setName(<span class="cm-string">"飞机");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp3.<span class="cm-variable">setName(<span class="cm-string">"汽车");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//public final int getPriority():返回此线程的优先级<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">tp1.<span class="cm-variable">getPriority()); <span class="cm-comment">//5<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">tp2.<span class="cm-variable">getPriority()); <span class="cm-comment">//5<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">tp3.<span class="cm-variable">getPriority()); <span class="cm-comment">//5<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//public final void setPriority(int newPriority):更改此线程的优先级<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; tp1.setPriority(10000); //IllegalArgumentException<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Thread.<span class="cm-variable">MAX_PRIORITY); <span class="cm-comment">//10<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Thread.<span class="cm-variable">MIN_PRIORITY); <span class="cm-comment">//1<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Thread.<span class="cm-variable">NORM_PRIORITY); <span class="cm-comment">//5<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//设置正确的优先级<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp1.<span class="cm-variable">setPriority(<span class="cm-number">5);<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp2.<span class="cm-variable">setPriority(<span class="cm-number">10);<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp3.<span class="cm-variable">setPriority(<span class="cm-number">1);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp2.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tp3.<span class="cm-variable">start();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h2>2.4 线程控制</h2> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">相关方法</span></p> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain md-expand">static void sleep(long millis)</span></span></td> <td><span class="td-span"><span class="md-plain">使当前正在执行的线程停留(暂停执行)指定的毫秒数</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void join()</span></span></td> <td><span class="td-span"><span class="md-plain">等待这个线程死亡</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void setDaemon(boolean on)</span></span></td> <td><span class="td-span"><span class="md-plain">将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-variable">sleep演示:<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadSleep <span class="cm-keyword">extends <span class="cm-variable">Thread {<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable-3">int <span class="cm-variable">i <span class="cm-operator">= <span class="cm-number">0; <span class="cm-variable">i <span class="cm-operator">&lt; <span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">getName() <span class="cm-operator">+ <span class="cm-string">":" <span class="cm-operator">+ <span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">try {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Thread.<span class="cm-variable">sleep(<span class="cm-number">1000);<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">catch (<span class="cm-variable">InterruptedException <span class="cm-variable">e) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">e.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadSleepDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadSleep <span class="cm-variable">ts1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadSleep();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadSleep <span class="cm-variable">ts2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadSleep();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadSleep <span class="cm-variable">ts3 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadSleep();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts1.<span class="cm-variable">setName(<span class="cm-string">"曹操");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts2.<span class="cm-variable">setName(<span class="cm-string">"刘备");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts3.<span class="cm-variable">setName(<span class="cm-string">"孙权");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts2.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts3.<span class="cm-variable">start();<br><span> &nbsp; }<br><span>}<br><span><span>​<br><span><span class="cm-variable">Join演示:<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadJoin <span class="cm-keyword">extends <span class="cm-variable">Thread {<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable-3">int <span class="cm-variable">i <span class="cm-operator">= <span class="cm-number">0; <span class="cm-variable">i <span class="cm-operator">&lt; <span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">getName() <span class="cm-operator">+ <span class="cm-string">":" <span class="cm-operator">+ <span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadJoinDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadJoin <span class="cm-variable">tj1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadJoin();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadJoin <span class="cm-variable">tj2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadJoin();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadJoin <span class="cm-variable">tj3 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadJoin();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj1.<span class="cm-variable">setName(<span class="cm-string">"康熙");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj2.<span class="cm-variable">setName(<span class="cm-string">"四阿哥");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj3.<span class="cm-variable">setName(<span class="cm-string">"八阿哥");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">try {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj1.<span class="cm-variable">join();<br><span> &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">catch (<span class="cm-variable">InterruptedException <span class="cm-variable">e) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">e.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj2.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tj3.<span class="cm-variable">start();<br><span> &nbsp; }<br><span>}<br><span><span>​<br><span><span class="cm-variable">Daemon演示:<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadDaemon <span class="cm-keyword">extends <span class="cm-variable">Thread {<br><span> &nbsp; &nbsp;<span class="cm-meta">@Override<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">run() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable-3">int <span class="cm-variable">i <span class="cm-operator">= <span class="cm-number">0; <span class="cm-variable">i <span class="cm-operator">&lt; <span class="cm-number">100; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">getName() <span class="cm-operator">+ <span class="cm-string">":" <span class="cm-operator">+ <span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}<br><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ThreadDaemonDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadDaemon <span class="cm-variable">td1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadDaemon();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ThreadDaemon <span class="cm-variable">td2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ThreadDaemon();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">td1.<span class="cm-variable">setName(<span class="cm-string">"关羽");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">td2.<span class="cm-variable">setName(<span class="cm-string">"张飞");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//设置主线程为刘备<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Thread.<span class="cm-variable">currentThread().<span class="cm-variable">setName(<span class="cm-string">"刘备");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//设置守护线程<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">td1.<span class="cm-variable">setDaemon(<span class="cm-atom">true);<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">td2.<span class="cm-variable">setDaemon(<span class="cm-atom">true);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">td1.<span class="cm-variable">start();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">td2.<span class="cm-variable">start();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for(<span class="cm-variable-3">int <span class="cm-variable">i<span class="cm-operator">=<span class="cm-number">0; <span class="cm-variable">i<span class="cm-operator">&lt;<span class="cm-number">10; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Thread.<span class="cm-variable">currentThread().<span class="cm-variable">getName()<span class="cm-operator">+<span class="cm-string">":"<span class="cm-operator">+<span class="cm-variable">i);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h2>2.5 线程的生命周期</h2> <p><img src="https://uploadfiles.nowcoder.com/images/20220330/323179052_1648608089987_45F45A6D6021EDE28F82508561673291"></p> <h1>&nbsp;</h1> <p>&nbsp;</p>