java創建線程的兩種方法
『壹』 如何創建線程如何保證線程安全
在java中如果要創建線程的話,一般有兩種方式:
1.繼承Thread類;
2.實現Runnable介面。
1.使用線程安全的類;
使用synchronized同步代碼塊,或者用Lock鎖;
多線程並發情況下,線程共享的變數改為方法局部級變數;
線程安全:
線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現數據不一致或者數據污染。 線程不安全就是不提供數據訪問保護,有可能出現多個線程先後更改數據造成所得到的數據是臟數據。
一般說來,確保線程安全的方法有這幾個:競爭與原子操作、同步與鎖、可重入、過度優化。
個人認為,保證線程安全,無外乎保持線程同步的方式,
如:@synchronized、NSLock、dispatch_semaphore、NSCondition、pthread_mutex、OSSpinLock。
然而:
OSSpinLock和dispatch_semaphore的效率遠遠高於其他。
@synchronized和NSConditionLock效率較差。
鑒於OSSpinLock的不安全,所以我們在開發中如果考慮性能的話,建議使用dispatch_semaphore。
如果不考慮性能,只是圖個方便的話,那就使用@synchronized。
如何保證呢:
由於線程安全問題,使用synchronized同步代碼塊 原理:當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。 另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。
作者:squirrels
鏈接:https://www.jianshu.com/p/221df4cd63da
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
『貳』 java怎麼實現線程
1、繼承Thread類創建線程
Thread類本質上是實現了Runnable介面的一個實例,代表一個線程的實例。啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。
2、實現Runnable介面創建線程
如果自己的類已經extends另一個類,就無法直接extends Thread,此時,可以實現一個Runnable介面。
3、實現Callable介面通過FutureTask包裝器來創建Thread線程
4、使用ExecutorService、Callable、Future實現有返回結果的線程
ExecutorService、Callable、Future三個介面實際上都是屬於Executor框架。返回結果的線程是在JDK1.5中引入的新特徵,有了這種特徵就不需要再為了得到返回值而大費周折了。而且自己實現了也可能漏洞百出。
可返回值的任務必須實現Callable介面。類似的,無返回值的任務必須實現Runnable介面。
執行Callable任務後,可以獲取一個Future的對象,在該對象上調用get就可以獲取到Callable任務返回的Object了。
注意:get方法是阻塞的,即:線程無返回結果,get方法會一直等待。
再結合線程池介面ExecutorService就可以實現傳說中有返回結果的多線程了。
『叄』 java怎麼創建一個線程
Java線程類也是一個object類,它的實例都繼承自java.lang.Thread或其子類。可以用如下方式用java中創建一個線程:
Treadthread=newThread();
執行該線程可以調用該線程的start()方法:
thread.start();
編寫線程運行時執行的代碼有兩種方式:一種是創建Thread子類的一個實例並重寫run方法,第二種是創建類的時候實現Runnable介面。接下來我們會具體講解這兩種方法:
創建Thread的子類
創建Thread子類的一個實例並重寫run方法,run方法會在調用start()方法之後被執行。例子如下:
{
publicvoidrun(){
System.out.println("MyThreadrunning");
}
}
可以用如下方式創建並運行上述Thread子類
MyThreadmyThread=newMyThread();
myTread.start();
一旦線程啟動後start方法就會立即返回,而不會等待到run方法執行完畢才返回。就好像run方法是在另外一個cpu上執行一樣。當run方法執行後,將會列印出字元串MyThread running。
實現Runnable介面
第二種編寫線程執行代碼的方式是新建一個實現了java.lang.Runnable介面的類的實例,實例中的方法可以被線程調用。下面給出例子:
{
publicvoidrun(){
System.out.println("MyRunnablerunning");
}
}
為了使線程能夠執行run()方法,需要在Thread類的構造函數中傳入MyRunnable的實例對象。示例如下:
Threadthread=newThread(newMyRunnable());
thread.start();
當線程運行時,它將會調用實現了Runnable介面的run方法。上例中將會列印出」MyRunnable running」。
『肆』 java創建線程的幾種方式,了解一下
第一種方式:使用Runnable介面創建線程
第二種方式:直接繼承Thread類創建對象
使用Runnable介面創建線程
1.可以將CPU,代碼和數據分開,形成清晰的模型
2.線程體run()方法所在的類可以從其它類中繼承一些有用的屬性和方法
3.有利於保持程序的設計風格一致
直接繼承Thread類創建對象
1.Thread子類無法再從其它類繼承(java語言單繼承)。
2.編寫簡單,run()方法的當前對象就是線程對象,可直接操作。
在實際應用中,幾乎都採取第一種方式