搜尋
首頁常見問題一文搞懂java中的執行緒如何理解

本篇文章為大家帶來了關於java的相關知識,其中主要整理了線程的相關問題,線程(thread)是一個程式內部的一條執行路徑,我們所熟悉的main方法其實就是一條單獨執行路徑,若程序中只有一條執行路徑那麼這個程序就是單線程程序,下面一起來看一下,希望對大家有幫助。

一文搞懂java中的執行緒如何理解

推薦學習:《java影片教學

執行緒(thread)是一個程式內部的一條執行路徑,我們所熟悉的main方法其實就是一條單獨執行路徑,若程式中只有一條執行路徑那麼這個程式就是單線程程式;既然有單線程,那麼也相對的會有多線程,字面意思可以理解為“相對單執行緒從軟硬體上多條執行流程的技術”,多執行緒的好處是提高CPU的利用率。在多執行緒程式中,一個執行緒必須等待的時候,CPU可以運行其它的執行緒而不是等待,大大提高程式的效率。

多執行緒的建立 

方式一:繼承Thread類別 

方式一建立過程:

  • 定義一個子類別MyThread繼承線程類別java.lang.Thread,重寫run()方法;

  • 建立MyThread類別的物件;

  • 呼叫線程物件的start()方法啟動執行緒(啟動後仍執行run()方法); 

    public class ThreadDemo01 {
        public static void main(String[] args) {
            MyThread myThread1 = new MyThread();
            myThread1.start();
            for (int i = 0; i 
  • #在上述程式碼中共有兩個執行緒在執行,分別是main方法的主執行緒和執行緒物件mythread呼叫start()啟動的子執行緒。不過輸出結果為什麼會不唯一的呢?原因是因為兩個執行緒在執行過程中會發生CPU的搶佔,誰先搶到誰將優先執行。

那我們為什麼不直接使用執行緒物件呼叫run()方法呢?若直接呼叫run()則只是普通的呼叫方法,即單線程,而start()方法則是用來啟動的子線程的,由此才能出現多線程。

方式一優缺點:

  • 優點:編碼簡單;
  • #缺點:執行緒類別已經繼承Thread,無法繼承其他類,不利於擴充; 

方式二: 實作Runnable介面

方式二建立流程:

1、定義一個執行緒任務類別MyRunnable實作Runnable接口,重寫run()方法;

2、建立MyRunnable物件;

3、把MyRunnable任務物件交給Thread處理;

4、呼叫執行緒物件的start()方法啟動執行緒;

##public Thread (Runnable target , String name)封裝Runnable物件成為執行緒對象,並指定執行緒名稱
public class ThreadDemo02 {
    public static void main(String[] args) {
        MyRunnable target = new MyRunnable();
        Thread thread = new Thread(target);
        thread.start();
        for (int i = 0; i <p>该代码与方式一的不同之处在于需要将MyRunnable任务对象封装在Thread中,其他的地方是基本上是没有变化的。</p><p>方式二优缺点:</p><p>优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;</p><p>缺点:编程多一层对象包装,如果线程有执行结果是不可以直接返回的。</p><p>接下来我们同样使用实现Runnable接口(匿名内部类形式)来实现多线程的创建:</p><p>1、创建Runnable匿名内部类对象;</p><p>2、交给Thread处理;</p><p>3、调用线程对象的start()启动线程;</p><pre class="brush:php;toolbar:false">//正常版:
public class ThreadDemo01 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i  {
                for (int i = 0; i <p> 该种方法从本质上其实并没有太大的区别只不过是一个需要创建线程对象,而另一个则是通过匿名内部类实现的多线程。并且该块代码也可以通过lambda表达式进行精简,不知道大家是否还对这个知识点有印象呢?若忘记了可以看一下这篇文章:Java中的lambda表达式如何理解——精简</p><h2 id="方式三-实现Callable接口">方式三:实现Callable接口 </h2><p>在学习过前面两种创建多线程的方式以后,我们会发现存在一个问题:1、重写的run()方法不能直接返回结果;2、不适合需要返回线程执行结果的业务场景。因此,我们需要第三种方式来解决这些问题。 </p><p>方式三创建过程:</p><p>1、定义类实现Callable接口,重写call()方法,封装要做的事情;</p><p>2、用FutureTask把Callable对象封装成线程任务对象;</p><p>3、把线程任务对象交给Thread处理;</p><p>4、调用Thread的start()方法启动线程,执行任务;</p><p>5、线程执行完毕后,通过FutureTask的get()方法获取任务执行的结果。</p>
Thread建構器 方法
#public Thread (String name) 可以為目前執行緒指定名稱
public Thread (Runnable target) #封裝Runnable物件成為執行緒物件
方法名称 说明
public FutureTask(Callable call) 把Callable对象封装成FutureTask对象
public V get() throws Exception 获取线程执行call方法返回的结果
public class ThreadDemo03 {
    public static void main(String[] args) throws Exception {
        MyCallable myCallable = new MyCallable();
        FutureTask<string> futureTask = new FutureTask(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();
        int sum= 0;
        for (int i = 0; i  {
    @Override
    public String call(){
        int sum=0;
        for (int i = 0; i <p>方式三优缺点:</p>
<p>优点:</p>
<p>线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;</p>
<p>可以在线程执行完毕后去获取 线程执行的结果;</p>
<p>缺点:</p>
<p>编码复杂一点;</p>
<h2 id="总结">总结 </h2>
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody>
<tr class="firstRow">
<td>方式</td>
<td>优点</td>
<td>缺点</td>
</tr>
<tr>
<td>继承Thread类</td>
<td>编程比较简单,可以直接使用Thread类中的方法</td>
<td>扩展性较差,不能再继承其他的类,不能返回线程执行的结果</td>
</tr>
<tr>
<td>实现Runnable接口</td>
<td>扩展性强,实现该接口的同时还可以继承其他的类</td>
<td>编程相对复杂,不能返回线程执行的结果</td>
</tr>
<tr>
<td>实现Callable接口</td>
<td>扩展性强,实现该接口的同时还可以继承其他的类,可以得到线程的执行结果</td>
<td>编程相对复杂</td>
</tr>
</tbody></table>
<h2 id="常用方法">常用方法 </h2>
<h2 id="Thread获取和设置线程名称">Thread获取和设置线程名称 </h2>
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody>
<tr class="firstRow">
<td>方法名称</td>
<td>说明</td>
</tr>
<tr>
<td>String getName()</td>
<td>获取当前线程的名称,默认线程名称是Thread-索引</td>
</tr>
<tr>
<td>void setName(String name)</td>
<td><p>将此线程更改为指定的名称,通过构造器也可以设置线程名称</p></td>
</tr>
</tbody></table>
<p> 简单地通过一段代码让大家能够清晰地了解这个代码该如何使用:</p>
<pre class="brush:php;toolbar:false">public class ThreadDemo04 {
    public static void main(String[] args) throws Exception {
        thread thread1 = new thread();
        thread1.setName("1号子线程");
        thread1.start();
        thread thread2 = new thread();
        thread2.setName("2号子线程");
        thread2.start();
    }
}
class thread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i <h2 id="Thread类的线程休眠方法">Thread类的线程休眠方法 </h2>
方法名称 说明
public static void sleep(long time)  让当前线程休眠指定的时间后再继续执行,单位为毫秒
public class ThreadDemo05 {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i <p>推荐学习:《<a href="https://www.php.cn/course/list/36.html" target="_blank">java视频教程</a>》</p>

以上是一文搞懂java中的執行緒如何理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能