首頁 >Java >java教程 >Java多執行緒是什麼

Java多執行緒是什麼

(*-*)浩
(*-*)浩原創
2019-05-05 11:52:3414550瀏覽

本篇文章將介紹多執行緒和其實例。

Java多執行緒是什麼

Java編寫程式都運行在Java虛擬機器(JVM)中,在JVM的內部,程式的多任務是透過執行緒來實現的。每用java指令啟動一個java應用程式 序,就會啟動一個JVM程序。在同一個JVM進程中,有且只有一個進程,就是它自己。在這個JVM環境中,所有程式碼的運作都是以線 程來運作。

一般常見的Java應用程式都是單執行緒的。例如,用java指令執行一個最簡單的HelloWorld的Java應用程式時,就啟動了一個JVM進 程,JVM找到程式程式的入口點main(),然後執行main()方法,這樣就產生了一個線程,這個線程稱之為主線程。當main方法結束後,主執行緒運行完成。 JVM進程也隨即退出 。

對於一個行程中的多個執行緒來說,多個執行緒共享程序的記憶體區塊,當有新的執行緒產生的時候,作業系統不分配新的內存,而是讓新執行緒共享原有的進程塊的記憶體。因此,線程間的通訊很容易,速度也很快。不同的進程因為處於不同的記憶體區塊,因此進程之間的通訊相對困難。

推薦課程:Java教程

進程是指一個記憶體中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個行程中可以啟動多個執行緒。例如在Windows系統中,一個運行的exe就是一個進程。

執行緒是指進程中的一個執行流程,一個行程可以執行多個執行緒。例如java.exe進程可以運行很多執行緒。執行緒總是輸入某個進程,進程中的多個執行緒共享進程的記憶體。

多執行緒指的是這個程式(一個行程)運行時產生了不只一個執行緒

實例

線程1:接下來使用實作Runnable實作多執行緒的方法:。

public class TestRunnable implements Runnable {

    private int time=1;
    private SourceA s;
    private String id = "001";
    public TestRunnable(SourceA s){
        this.s = s;
    }
    public void setTime(int time) {
        this.time = time;
    }
    
    @Override
    public void run() {
        try {
            System.out.println("i will sleep"+ time);
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        synchronized(s){
            s.notify();
            System.out.println("我唤醒了002!");
            System.out.println("我存入了id"+id);
            s.setSource(id);
        }
    }

}

執行緒2:接下來使用繼承Thread實作多執行緒的方法:。

public class TestThread extends Thread {
    private int time = 1;
    private SourceA s = null;
    String id = "002";
    
    public void setTime(int time) {
        this.time = time;
    }
    
    public TestThread(SourceA s){
        this.s = s ;
    }
    
    @Override
    public void run() {
        try {
            System.out.println("i will sleep"+ time);
            sleep(time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        synchronized(s){
            try {
                System.out.println("我"+ id +"要进行等待了");
                s.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("我被唤醒了");
            System.out.println("我存入了id"+id);
            s.setSource(id);
        }
    }

}

將執行緒進行同步的類別,有get、set方法。

public class SourceA {
    private List<String> list = new ArrayList<String>();
    public synchronized void getSource(){
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
    public synchronized void setSource(String id){
        list.add(id);
    }
}

測試類別,將多執行緒結果列印到控制台中。

public void test(){
        SourceA s = new SourceA();
        TestThread tt = new TestThread(s);
        TestRunnable tr = new TestRunnable(s);
        Thread t = new Thread(tr);
        System.out.println("调用线程1");
        tt.start();
        System.out.println("调用线程2");
        t.start();
    }

以上是Java多執行緒是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn