標籤:java並發 並發 並行
轉載請註明:http://blog.csdn.net/UniKylin/article/details/45016117
1.線程和進程的區別
並行:是多個任務在同一時間同時執行,例如多核電腦同時計算的任務可以理解為並行
並發:從微觀上看是多個任務搶佔一個CPU從而執行自己的任務,輪流執行任務,但是如果遇到資源衝突的時候並沒有從根本提高執行效率。但是提高了CPU的使用效率。
前段時間在GitHub上的一幅圖可以很好的闡述上面的概念非常形象
2.Java中建立線程的兩種方式
1.第一種方式:直接繼承Thread:
public class Dog extends Thread { // 私人變數 private int number; // 初始化乘法表上限數字 public Dog(int number) { this.number = number; } //重寫邏輯方法 @Override public void run() { // 列印乘法表 for (int i = 1; i <= number; i++) { for (int j = 1; j <= i; j++) { System.out.print(j + " * " + i + " = " + i * j + "\t"); } System.out.println(); } } public static void main(String[] args) { Dog dog = new Dog(9); dog.start();//啟動線程列印乘法表 }}
2.第二種方式:實現Runnable介面的方式
public class Cat implements Runnable { private int number; public Cat(int number) { this.number = number; } //重寫邏輯方法 @Override public void run() { System.out.println("Current Thread :" + Thread.currentThread()); for (int i = 0; i <= number; i++) { for (int j = 0; j <= i; j++) { System.out.print(i + " * " + j + " = " + i * j + "\t"); } System.out.println(); } } public static void main(String[] args) { Thread task = new Thread(new Cat(9)); task.start(); }}
對比以上兩種方式可以發現:第一種方式繼承Thread不能再繼承其他父類,所以對於程式的擴充性不是很友好,但是可以通過this訪問當前線程的資訊。第二種方式繼承Runnable介面,從設計角度來看比較靈活,Java是不支援多繼承但是支援實現多個介面,這樣就可以將這個缺點給克服了,如果要訪問線程資訊需要使用Thread.currentThread();方法。
3.源碼分析
public class Thread implements Runnable { //關聯Runnable介面 private Runnable target; //線程邏輯方法 public void run() { if (target != null) { target.run(); } }}//線程介面public interface Runnable { //定義抽象的線程邏輯方法, public abstract void run();}
上面的Thread類和Runnable介面是Java JDK中兩個最重要的核心部分,繼承Thread屬於對JDK本身的系統類別的擴充,而實現Runnable介面的方式屬於實現一種標準。不管哪種方式JVM啟動線程的過程中都將他們進行裝載,只不過方式不一樣而已。具體哪種方法比較好,當然第二種方式從設計方面比較優雅和靈活。
Java並發編程-建立線程的兩種方式及區別