Java线程之两种方法Runnable和Thread的区别
生活随笔
收集整理的這篇文章主要介紹了
Java线程之两种方法Runnable和Thread的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在java中有兩種方式實現多線程,一種是繼承Thread類,一種是實現Runnable接口;
1》Thread類是在java.lang包中定義的。一個類只要繼承了Thread類同時覆寫了本類中的run()方法就可以實現多線程操作了,但是一個類只能繼承一個父類,這是此方法的局限。
package com.test.thread;public class ThreadTest extends Thread {private String name;public ThreadTest() {// TODO Auto-generated constructor stub}public ThreadTest(String name){this.name=name;}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();for(int i=0;i<20;i++){System.out.println(this.name+"run()--"+i);}}}
package com.test.thread;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubThreadTest ttA = new ThreadTest("Thread A");ttA.run();ThreadTest ttB = new ThreadTest("Thread B");ttB.run();}}
輸出為:
Thread Arun()--20 Thread Arun()--19 Thread Arun()--18 Thread Arun()--17 Thread Arun()--16 Thread Arun()--15 Thread Arun()--14 Thread Arun()--13 Thread Arun()--12 Thread Arun()--11 Thread Arun()--10 Thread Arun()--9 Thread Arun()--8 Thread Arun()--7 Thread Arun()--6 Thread Arun()--5 Thread Arun()--4 Thread Arun()--3 Thread Arun()--2 Thread Arun()--1 Thread Brun()--20 Thread Brun()--19 Thread Brun()--18 Thread Brun()--17 Thread Brun()--16 Thread Brun()--15 Thread Brun()--14 Thread Brun()--13 Thread Brun()--12 Thread Brun()--11 Thread Brun()--10 Thread Brun()--9 Thread Brun()--8 Thread Brun()--7 Thread Brun()--6 Thread Brun()--5 Thread Brun()--4 Thread Brun()--3 Thread Brun()--2 Thread Brun()--1
但是,此時結果很有規律,先第一個對象執行,然后第二個對象執行,并沒有相互運行。在JDK的文檔中可以發現,一旦調用start()方法,則會通過JVM找到run()方法。下面啟動start()方法啟動線程:
package com.test.thread;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubThreadTest ttA = new ThreadTest("Thread A");//ttA.run();ttA.start();ThreadTest ttB = new ThreadTest("Thread B");//ttB.run();ttB.start();}} 測試結果:
Thread Arun()--20 Thread Arun()--19 Thread Arun()--18 Thread Arun()--17 Thread Arun()--16 Thread Arun()--15 Thread Arun()--14 Thread Arun()--13 Thread Arun()--12 Thread Arun()--11 Thread Brun()--20 Thread Arun()--10 Thread Brun()--19 Thread Arun()--9 Thread Arun()--8 Thread Arun()--7 Thread Arun()--6 Thread Brun()--18 Thread Arun()--5 Thread Brun()--17 Thread Arun()--4 Thread Brun()--16 Thread Arun()--3 Thread Brun()--15 Thread Brun()--14 Thread Brun()--13 Thread Arun()--2 Thread Brun()--12 Thread Arun()--1 Thread Brun()--11 Thread Brun()--10 Thread Brun()--9 Thread Brun()--8 Thread Brun()--7 Thread Brun()--6 Thread Brun()--5 Thread Brun()--4 Thread Brun()--3 Thread Brun()--2 Thread Brun()--1
這樣程序可以正常完成交互式運行。那么為啥非要使用start()方法啟動多線程呢?
在JDK的安裝路徑下,src.zip是全部的java源程序,通過此代碼找到Thread中的start()方法的定義,可以發現此方法中使用了private native void start0();其中native關鍵字表示可以調用操作系統的底層函數,那么這樣的技術成為JNI技術(java Native Interface)
2》
Runnable接口
在實際開發中一個多線程的操作很少使用Thread類,而是通過Runnable接口完成。
package com.test.thread;public class ThreadTest2 implements Runnable {private String name;int count = 20;public ThreadTest2() {// TODO Auto-generated constructor stub}public ThreadTest2(String name) {this.name = name;}@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 0; i < 20; i++) {if (this.count > 0)System.out.println(this.name + "run()--" + count--);}}}
測試代碼:
package com.test.thread;public class Test {public static void main(String[] args) {// TODO Auto-generated method stub// ThreadTest ttA = new ThreadTest("Thread A"); // //ttA.run(); // ttA.start(); // ThreadTest ttB = new ThreadTest("Thread B"); // //ttB.run(); // ttB.start();ThreadTest2 ttA=new ThreadTest2("Thread A");new Thread(ttA).start();ThreadTest2 ttB=new ThreadTest2("Thread B");new Thread(ttB).start();}}
測試結果:
Thread Brun()--20 Thread Brun()--19 Thread Brun()--18 Thread Brun()--17 Thread Arun()--20 Thread Brun()--16 Thread Brun()--15 Thread Brun()--14 Thread Arun()--19 Thread Arun()--18 Thread Brun()--13 Thread Brun()--12 Thread Brun()--11 Thread Arun()--17 Thread Brun()--10 Thread Arun()--16 Thread Arun()--15 Thread Brun()--9 Thread Brun()--8 Thread Brun()--7 Thread Brun()--6 Thread Brun()--5 Thread Brun()--4 Thread Brun()--3 Thread Arun()--14 Thread Arun()--13 Thread Arun()--12 Thread Arun()--11 Thread Arun()--10 Thread Arun()--9 Thread Brun()--2 Thread Brun()--1 Thread Arun()--8 Thread Arun()--7 Thread Arun()--6 Thread Arun()--5 Thread Arun()--4 Thread Arun()--3 Thread Arun()--2 Thread Arun()--1
兩種實現方式的區別和聯系:
在程序開發中只要是多線程肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下好處:
(1)避免繼承的局限,一個類可以繼承多個接口。
(2)適合于資源的共享
以賣票程序為例,通過Thread類完成:
還是利用上述代碼,只不過測試代碼為:
package com.test.thread;public class Test {public static void main(String[] args) {// TODO Auto-generated method stub// ThreadTest ttA = new ThreadTest("Thread A");// //ttA.run();// ttA.start();// ThreadTest ttB = new ThreadTest("Thread B");// //ttB.run();// ttB.start();ThreadTest2 ttA = new ThreadTest2("Thread A");// 同一個ttA可以,但是通過繼承Thread類卻不可以,如果用同一個實例化對象就會出現異常new Thread(ttA).start();new Thread(ttA).start();new Thread(ttA).start();}} 測試結果:
Thread Arun()--19 Thread Arun()--17 Thread Arun()--16 Thread Arun()--15 Thread Arun()--14 Thread Arun()--18 Thread Arun()--20 Thread Arun()--12 Thread Arun()--13 Thread Arun()--9 Thread Arun()--8 Thread Arun()--10 Thread Arun()--6 Thread Arun()--5 Thread Arun()--11 Thread Arun()--3 Thread Arun()--4 Thread Arun()--7 Thread Arun()--1 Thread Arun()--2 雖然現在程序中有三個線程,但是一共賣了20張票,也就是說使用Runnable實現多線程可以達到資源共享目的。
Runnable接口和Thread之間的聯系:
public class Thread extends Object implements Runnable
發現Thread類也是Runnable接口的子類。
原文鏈接:http://blog.csdn.net/wwww1988600/article/details/7309070
總結
以上是生活随笔為你收集整理的Java线程之两种方法Runnable和Thread的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Intent来启动Activity并
- 下一篇: Handler 基本用法--线程间传值