本篇文章將介紹多執行緒和其實例。
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中文網其他相關文章!