java中实现多线程的三种方式
java中實現多線程的三種方式
1、實現多線程的方法:
在java中實現多線程的兩途徑:繼承Thread類,實現Runable接口(Callable)2、繼承Thread類實現多線程:
? 繼承類Thread是支持多線程的功能類,只要創建一個子類就可以實現多線程的支持。
所有的java程序的起點是main方法,所以線程一定有自己的起點,那這個起點就是run方法;因為多線程的每個主體類之中必須重寫Thread的run方法。
public void run()這個run方法沒有返回值,那就說明線程一旦開始就一直執行不能返回內容。
2.1線程案例:
? 編寫一個測試線程類繼承Thread 在run方法中寫一個循環輸出語句;
分析:創建多個測試類啟動線程,多個線程回想進程一樣,輪流搶占資源,所以多線程程序應該是多個線程彼此交替執行;
class TestThread extends Thread{//內部類String name;TestThread( String name){this.name=name;}@Overridepublic void run(){for(int i=1;i<10;i++) {System.out.print(name + i);}}}public class MyThread {public static void main(String[] args) {new TestThread("A").run();new TestThread("B").run();new TestThread("C").run();} }上面是調用Thread的run方法,但是查看日志輸出并不是交替輸出如下
A1A2A3A4A5A6A7A8A9B1B2B3B4B5B6B7B8B9C1C2C3C4C5C6C7C8C9本線程類的功能是進行循環的輸出操作,所有的線程與進程是一樣的,都必須輪流去搶占資源,所以多線程的執行應該是多個線程彼此交替執行,也就是說如果調用了run方法,那么并不能夠啟動多線程,多線程啟動的唯一方法是調用Thread的start方法(調用此方法執行的是run方法體)。
修改如下:
public class MyThread {public static void main(String[] args) {new TestThread("A").start();new TestThread("B").start();new TestThread("C").start();} }運行結果
B1C1A1C2C3B2B3C4A2A3A4A5A6A7A8A9C5C6C7B4B5B6B7B8B9C8C9疑問?為什么多線程的啟動不是調用run方法而必須調用start方法?
找到java的源代碼:在jdk安裝的目錄找到src壓縮包解壓,在java.lang包里的Thread的start方法如下:
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 thenit will be passed up the call stack */}}}private native void start0();在start方法里,開始的地方有IllegalThreadStateException異常拋出,防止線程啟動重復。
? 發現在start方法里面要調用一個start0方法,而且此方法的結構和抽象方法類似,使用了native聲明,在Java開發里面有一門技術稱為JNI技術(Java Native Interface),這門技術的特點:是使用Java調用本機操作系統提供的函數。但是有個缺點:不能夠離開特定的操作系統。
總結:使用Thread類的start方法不僅僅啟動多線程的執行代碼,還要從不同操作系統中分配資源。
3、實現Runnable
? Java具有單繼承局限,所有的Java程序針對類的繼承都應該是回避,那么線程也一樣,為了解決單繼承的限制,因此才有Runnable接口代碼如下:
@FunctionalInterface public interface Runnable{public void run(); }這個接口有點特殊是@FunctionalInterface注解修飾的,這是函數式接口,特征是:一個接口只有一個方法。
接口中的方法都是public權限,不存在默認權限。
使用方法:讓一個類實現Runnable接口即可,并且也需要覆寫run()方法。
疑問:但是此接口只有run方法,沒有start方法,怎么啟動多線程呢?
不管任何情況下,如果要想啟動多線程一定要依靠Thread類完成,在Thread類中有參數是Runnable參數的構造方法:
- Thread(Runnable target) 接收的是Runnable接口
可以創建一個參數是Runnable實現類的Thread類,調用start方法啟動。
public class MyThread {public static void main(String[] args) {new Thread(new TestThread("A")).start();new Thread(new TestThread("B")).start();new Thread(new TestThread("C")).start();} }總結:實現Runnable接口來寫多線程的業務類,用Thread來啟動多線程。
總結
以上是生活随笔為你收集整理的java中实现多线程的三种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】独立同分布(IID)数据集
- 下一篇: 恢复MAC保存丢失的word文档