java併發程式設計專題(二)----如何建立並執行java執行緒
實現執行緒的兩種方式
上一節我們瞭解了關於執行緒的一些基本知識,下面我們正式進入多執行緒的實現環節。實現執行緒常用的有兩種方式,一種是繼承Thread類,一種是實現Runnable介面。當然還有第三種方式,那就是通過執行緒池來生成執行緒,後面我們還會學習,一步一個腳印打好基礎。
Runnable介面:
public interface Runnable { public abstract void run(); }
Thread類:
public class Thread implements Runnable { public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } @Override public void run() { if (target != null) { target.run(); } } }
上面為Thread類和Runnable類的原始碼,我們可以看到Thread類也是實現了Runnable介面,即Thread是Runnable的實現,那麼他們到底在實現多執行緒上有什麼區別呢?
Thread和Runnable解析:
(1)Runnable介面:
Runnable介面是java中執行緒的定義類。所有執行緒都是通過該介面來實現,該介面中的run()方法為實現方法,即執行緒所要實現的內容寫入該方法裡面,當執行緒啟動時會呼叫該方法。
在大多數情況下,如果只想重寫run()方法而不重寫其他方法,應使用Runnable介面。
public class ThreadDemo3 { public static void main(String[] args) { //new了兩個執行緒物件——s1和s2 //其中兩個物件各對應一個記憶體區域。執行緒執行過程中執行都是自己記憶體塊中的資料 Shop1 s1 = new Shop1("小武"); s1.start(); Shop1 s2 = new Shop1("小潘"); s2.start(); /* //例項化了兩個執行緒物件,所以分配了兩塊記憶體空間 //執行過程中操作的是自己的記憶體空間 Shop2 s3 = new Shop2("小武"); s3.run(); Shop2 s4 = new Shop2("小潘"); s4.run(); //實際例項化了兩個執行緒物件 //所以同樣分配兩個記憶體空間 Thread t1 = new Thread(new Shop2("小武")); t1.start(); Thread t2 = new Thread(new Shop2("小潘")); t2.start(); */ //建立了兩個執行緒物件,但是使用的是同一個物件——s6 Shop2 s5 = new Shop2("w"); Shop1 s6 = new Shop1("T"); Thread t3 = new Thread(s6); t3.start(); Thread t4 =new Thread(s6); t4.start(); } } /** * 武大郎賣燒餅(因為業務的拓展,現在可以實現多視窗的出售) * 要求:每天只賣10個 * */ class Shop1 extends Thread{ //private int count = 10; //使用靜態變數可以有效的實現資源共享(因為在記憶體中只有一份count) private static int count = 10; public Shop1(String name) { super(name); } public void run(){ //判斷是否已經賣完 while(count>0){ count--; System.out.println(this.getName() +"賣出了一個燒餅" + ",現在剩餘" + count); } } } /** * 使用介面實現上面的程式碼 * */ class Shop2 implements Runnable{ //私有變數,儲存剩餘燒餅的個數 private int count = 10; //儲存當前人的姓名 private String name=""; public Shop2(String name) { this.name = name; } /** * 實現銷售的方法 */ public void run(){ //判斷是否已經賣完 while(count>0){ count--; System.out.println(Thread.currentThread().getId() + "、" + this.name +"賣出了一個燒餅" + ",現在剩餘" + count); } } }
(2)Thread類:
Thread類是Runnable介面的實現,jdk給我們提供了一個不用我們去想如何實現執行緒的方式供我們使用。同樣你在繼承Thread類的時候也需要重寫run()方法來實現你想線上程中實現的內容。
public class Test{ public static void main(String[] args) { //傳統方式——單任務方式 /* SimpleClass sc1 = new SimpleClass(); sc1.say("Mike"); SimpleClass sc2 = new SimpleClass(); sc2.say("Han Meimei"); */ //建立一個執行緒 ThreadClass tc1 = new ThreadClass("Mike"); //啟動執行緒 tc1.start(); //建立一個執行緒 ThreadClass tc2 = new ThreadClass("Han Meimei"); tc2.start(); } } } class SimpleClass{ public void say(String name){ while(true){ System.out.println("Hi,Im " + name); } } } class ThreadClass extends Thread{ public ThreadClass(String name) { super(name); } /** * 將父類(Thread)的run()方法進行重寫 * 在run()方法中包含了需要執行的程式碼 */ public void run(){ while(true){ System.out.println("Hi,Im " + this.getName() + "|" + this.getId() + "|" + this.getStackTrace()); } } }
Thread類中常用方法:
run():如果該執行緒時使用獨立的Runnable執行物件構造的,則呼叫該Runnable物件的run方法。否則,該方法不執行任何操作並返回。
sleep(longmillls):在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行),此操作受到系統計時器和排程程式精度和準確性的影響 String
yield():暫停當前正在執行的執行緒物件,並執行其他執行緒 start():使該執行緒開始執行,java虛擬機器再呼叫該執行緒的run方法
join():等待該執行緒結束
對比:
上面給出了Thread和Runnable的實現,我們能看到在使用Runnable的方式實現執行緒的過程中:
Shop1 s6 = new Shop1("T"); Thread t3 = new Thread(s6); t3.start();
即把Runnable物件(實現了Runnable介面的物件)還是塞進了Thread中讓Thread來實現。那麼我們可以new 多個Thread來實現同一個Runnbale物件,即實現了資源的共享,比如在售票系統中多名使用者對同一種票的搶購。另一方面,java是單繼承多實現的,如果我們使用Thread的話意味著該類只能繼承Thread,對於程式的擴充套件不利,而實現Runnbale介面則沒有這個顧慮。考慮程式的健壯性,我們應該儘量使用Runnable來實現我們的執行緒。
run和start
初學多執行緒我們總是分不清楚run()方法和start()方法的區別,其實我們再看一下上面Thread類的原始碼就不難發現他們的用法是很容易區分的:
- run()方法是執行緒的實現方法,即你需要執行緒去做什麼事情,那麼這些實現的內容寫在run()裡面,當執行緒啟動時就會呼叫run()方法繼而實現run()內部的程式碼;
- start()方法是執行緒的啟動方法,即如果你new Thread()這樣並不算完。你還得new Thread().start()才算啟動這個執行緒,啟動完之後執行緒內部會主動的呼叫run()方法執行該執行緒的業務邏輯程式碼。
以上就是java併發程式設計專題(二)----如何建立並執行java執行緒的詳細內容,更多關於JAVA 建立並執行java執行緒的資料請關注我們其它相關文章!