溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java 中多線程的原理是什么

發布時間:2021-07-05 18:36:40 來源:億速云 閱讀:148 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關java 中多線程的原理是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。


1.基本概念

程序、進程、線程

  • 程序(program)是為完成特定任務、用某種語言編寫的一組指令的集 合。即指一段靜態的代碼,靜態對象。

  • 進程(process)是程序的一次執行過程,或是正在運行的一個程序。是 一個動態的過程:有它自身的產生、存在和消亡的過程——具有生命 周期??梢岳斫鉃橐粋€正在運行的軟件。

  • 線程(thread),進程可進一步細化為線程,是一個程序內部的一條執行 路徑??梢岳斫鉃橐粋€軟件的功能。

多線程程序的優點:

  • 提高應用程序的響應。對圖形化界面更有意義,可增強用戶體驗。

  • 提高計算機系統CPU的利用率。

  • 改善程序結構。將既長又復雜的進程分為多個線程,獨立運行,利于理 解和修改。

2.多線程的創建

在Java中我們可以使用java.lang.Thread類來實現 ,要想我們的類具有多線程的功能,需要讓我們的類去繼承Thread類,然后重寫run()方法,并調用 start()方法來啟動多線程。

示例 1:

public class MyThread extends Thread{
    public void run(){
        for (int i = 0; i < 50; i++) {
            System.out.println("MyThread:"+i);
        }
    }
}
public class MyThreadTest{
    public static void main(String[] args){
        Thread t1 = new MyThread();
        t1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("world=====" + i);
        }
    }
}

說明:創建一個Java類繼承Thread類,并重寫父類Thread中的run方法,在run方法中寫具體的多線程業務。創建線程類的對象,并調用start方法啟動多線程。

**注意:**多線程的啟動調用的是start方法,在jvm底層中start方法內部會調用run方法。

一個對象只需要調用一次start()方法,如果多次調用則會拋出異?!癐llegalThreadStateException”。

示例 2:

public class MyRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 50 ; i++) {
            System.out.println( "MyRunnable:"+i);
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread( new MyRunnable());
        thread.start();// 只有調用Thread類中的start()方法才可以實現多線程
            for (int i = 0; i < 50; i++) {
                System.out.println("main:" + i);
            }
    }
}

說明:

  • 編寫一個類,實現Runnable接口;

  • 重寫run()方法;

  • 根據Runnable子類對象來創建Thread對象;

  • 通過Thread對象調用start()方法來啟動多線程;

總結:

  • 繼承Thread:重寫run()方法,業務代碼在run()中。

  • 實現Runnable:線程代碼存在接口的子類的run方法。

  • 通過Callable和線程池的方式創建線程。

**提示:**在應用中我們如果可以使用Runable接口那么就盡量使用,這樣可以避免Java單繼承的局限。

3.Thread類方法介紹

1)currentThread():返回當前正在執行的線程對象的引用。

2)getName():返回當前線程的名稱

3)isAlive():判斷當前線程是否存活

4)isDeaomon():判斷線程是否為守護線程

5)join():在當前線程中引入另一個線程,而當前線程會被阻塞

6)sleep():讓當前線程進入睡眠狀態

7)yield():讓當前線程放棄CPU的執行權,重新進入排隊,與其他線程平等爭奪CPU執行。

8)interrupt() 中斷線程 9)interrupted() 如果當前線程已經中斷,則返回 true;否則返回 false。

示例:

public class ThreadTest {
    public static void main(String[] args) {
        //創建線程并開啟線程1
        Thread thread = new MyThread();
        thread.start();
        //創建線程并開啟線程2
        Thread thread1 = new Thread(new MyRunnable());
        thread1.start();
        //創建線程并開啟線程3
        MyCallable myCallable = new MyCallable();
        FutureTask futureTask = new FutureTask(myCallable);
        new Thread(futureTask).start();

        for (int i = 0; i < 100; i++) {
            if (i== 50){
                //在main線程中當i=50加如thread線程,會在thread執行完后才會繼續執行main線程剩下的
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("main:"+i);
        }
    }
}

public class MyThread extends Thread{
    public void run(){
        for (int i = 0; i < 100; i++) {
            // void interrupt() 中斷線程 可以理解為線程中斷狀態有 true | false,每一次調用就是修改狀態為true
            //static boolean interrupted() 如果當前線程已經中斷,則返回 true;否則返回 false。
            Thread.currentThread().interrupt();
            if (Thread.interrupted()){
                System.out.println("Thread interrupted");
            }
            // static currentThread()  返回對當前正在執行的線程對象的引用
            //String getName()   返回該線程的名稱。
            //Thread.currentThread().getName()  獲取當前線程對象的名稱
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("MyRunnable"+i);
            //每次執行完打印讓線程休眠1秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class MyCallable implements Callable {
    @Override
    public Object call() throws Exception {
        for (int i = 0; i < 100; i++) {
            System.out.println("MyCallable:"+i);
        }
        return null;
    }
}

看完上述內容,你們對java 中多線程的原理是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女