Java總結之線程(1)
java線程是很重要的一項,所以作為java程序員必須要掌握的。
理解java線程必須先理解線程在java中的生命周期。、
1.java線程生命周期
1.new 創建一個線程 java中創建線程有三種方式,1.繼承Thread類,2.繼承Runnable介面,然後重寫父類的run方法。
2.Runnable 線程處於就緒狀態,隨時可以被cpu調用。
3.Running 線程處於運行狀態,此時線程正在CPU中執行。
4.Blocked 線程處於阻塞狀態,由於某種原因,cpu暫時中斷線程的資源。只有線程再次進入就緒狀態才能重新被cpu調用,同時阻塞有三種狀態
(1)等待阻塞:運行狀態中的線程執行wait方法,使本線程進入等待阻塞狀態。
(2)同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所佔用),它會進入同步阻塞狀態;
(3)其他阻塞:通過調用線程的sleep或join或發出了I/O請求時,線程會進入到阻塞狀態。當sleep狀態超時、join等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
(4)死亡狀態:線程運行完畢或因異常終止線程,該線程結束生命周期。
2.線程的三種創建方式
(1) 繼承Thread類
public class MyThread extends Thread{
public MyThread(String name){
super(name);
}
@Override
public void run {
for(int i=0;i<100;i++)
System.out.println(Thread.currentThread.getName+" "+i);
}
}
(2)繼承Runnable介面
public class MyRunnable implements Runnable{
private boolean stop=false;
@Override
public void run {
for(int i=0;i<100&&!stop;i++){
System.out.println(Thread.currentThread.getName+" "+i);
}
}
public void stopThread{
this.stop=true;
}
}
二者的區別在於Thread繼承Runnable類,然後再繼承Thread類從而調用線程,而Runnable類是一個介面,通過直接繼承Runnable類來實現。
同時二者在創建時還有區別
測試 Thread:
public void testThread {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread.getName + " " + i);
if (i == 30) {
MyThread myThread1 = new MyThread("窗口1");
MyThread myThread2 = new MyThread("窗口2");
MyThread myThread3 = new MyThread("窗口3");
MyThread myThread4 = new MyThread("窗口4");
myThread1.start;
myThread2.start;
myThread3.start;
myThread4.start;
}
}
}
測試Runnable方式:
public void testRunnable {
int i = 0;
for (i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread.getName + " " + i);
if (i == 30) {
Runnable myRunnable = new MyRunnable;
Thread thread1 = new Thread(myRunnable);
Thread thread2 = new Thread(myRunnable);
thread1.start;
thread2.start;
}
}
}
可以看出來在繼承Thread類後通過new 一個繼承了Thread的MyThread類來實現線程的創建,然後通過調用Thread方法中的start方法使線程處於就緒狀態。
而繼承了Runnable方法的類new一個MyRunnable 然後在將myRunnable放入new的一個Thread中,然後在通過start方法使線程處於就緒狀態。
3.繼承Callable類
public class MyCallable implements Callable
private int i=0;
@Override
public Integer call throws Exception {
int sum=0;
for(;i<100;i++){
System.out.println(Thread.currentThread.getName+" "+i);
sum+=i;
}
return sum;
}
}
測試:
public void testCallable { 通過測試你會發現繼承了Callable類之後會通過FutureTask類進行包裝,然後再在Thread中調用,查api你會看到FutureTask類既繼承了Future類又繼承了Runnabl類,同時Callabl類與另外兩個的區別在於call方法有返回參數。
Callable
FutureTask
for (int i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread.getName + " " + i);
if (i == 30) {
Thread thread = new Thread(ft);
thread.start;
}
}
System.out.println("主線程執行完畢");
try {
int sum = ft.get;
System.out.println("sum= " + sum);
} catch (Exception e) {
e.printStackTrace;
}
}
※如何使用Node.js編寫命令工具——以vue-cli為例
※限制input「type=number」的輸入位數策略整理
※ASP.NET MVC 重寫RazorViewEngine實現多主題切換
※我的面試準備過程——JVM相關
※運維腳本:文件的空間使用和IO統計
TAG:科技優家 |
※Mariadb學習總結(七):單表查詢
※Mariadb學習總結(三):數據類型
※優美的信息圖:吳恩達點贊的deeplearning.ai課程總結
※AWS re:Invent 2017大會回顧總結
※Mariadb學習總結(八):聚合函數及分組查詢
※JMeter測試WebSocket的經驗總結
※持守Ashtanga318天的總結
※我的Chromebook日記第四篇之總結
※Web Services總結
※看完三星Note 9,網友總結:Note 8 renew
※Mariadb學習總結(四):數據的插入刪除與修改
※LCK:SKT春季賽半程總結 faker表示打出80%的實力
※Mariadb學習總結(二):資料庫及表管理
※VBScript 總結
※E3 任天堂展區體驗總結:Everyone Play Together
※IMDb 總結《Avengers : Endgame》主要角色的上場時間
※總結:iview(基於vue.js的開源ui組件)學習的一些坑
※Pixel Watch預測總結Google狙擊 pple Watch的秘密武器
※Anitama的2018年終總結
※介面測試總結分享(http與rpc)