什麼是java線程
1. java線程的作用什麼
線程同步我們可以在計算機上運行各種計算機軟體程序。每一個運行的程序可能包括多個獨立運行的線程(Thread)。 線程(Thread)是一份獨立運行的程序,有自己專用的運行棧。線程有可能和其他線程共享一些資源,比如,內存,文件,資料庫等。
當多個線程同時讀寫同一份共享資源的時候,可能會引起沖突。這時候,我們需要引入線程「同步」機制,即各位線程之間要有個先來後到,不能一窩蜂擠上去搶作一團。
同步這個詞是從英文synchronize(使同時發生)翻譯過來的。我也不明白為什麼要用這個很容易引起誤解的詞。既然大家都這么用,咱們也就只好這么將就。
線程同步的真實意思和字面意思恰好相反。線程同步的真實意思,其實是「排隊」:幾個線程之間要排隊,一個一個對共享資源進行操作,而不是同時進行操作。
因此,關於線程同步,需要牢牢記住的第一點是:線程同步就是線程排隊。同步就是排隊。線程同步的目的就是避免線程「同步」執行。這可真是個無聊的繞口令。
關於線程同步,需要牢牢記住的第二點是 「共享」這兩個字。只有共享資源的讀寫訪問才需要同步。如果不是共享資源,那麼就根本沒有同步的必要。
關於線程同步,需要牢牢記住的第三點是,只有「變數」才需要同步訪問。如果共享的資源是固定不變的,那麼就相當於「常量」,線程同時讀取常量也不需要同步。至少一個線程修改共享資源,這樣的情況下,線程之間就需要同步。
關於線程同步,需要牢牢記住的第四點是:多個線程訪問共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執行同一份代碼,只要這些線程的代碼訪問同一份可變的共享資源,這些線程之間就需要同步。
為了加深理解,下面舉幾個例子
有兩個采購員,他們的工作內容是相同的,都是遵循如下的步驟:
(1)到市場上去,尋找並購買有潛力的樣品。
(2)回到公司,寫報告。
這兩個人的工作內容雖然一樣,他們都需要購買樣品,他們可能買到同樣種類的樣品,但是他們絕對不會購買到同一件樣品,他們之間沒有任何共享資源。所以,他們可以各自進行自己的工作,互不幹擾。這兩個采購員就相當於兩個線程;兩個采購員遵循相同的工作步驟,相當於這兩個線程執行同一段代碼。
下面給這兩個采購員增加一個工作步驟。采購員需要根據公司的「布告欄」上面公布的信息,安排自己的工作計劃。 這兩個采購員有可能同時走到布告欄的前面,同時觀看布告欄上的信息。這一點問題都沒有。因為布告欄是只讀的,這兩個采購員誰都不會去修改布告欄上寫的信息 下面增加一個角色。一個辦公室行政人員這個時候,也走到了布告欄前面,准備修改布告欄上的信息。
如果行政人員先到達布告欄,並且正在修改布告欄的內容。兩個采購員這個時候,恰好也到了。這兩個采購員就必須等待行政人員完成修改之後,才能觀看修改後的信息。
如果行政人員到達的時候,兩個采購員已經在觀看布告欄了。那麼行政人員需要等待兩個采購員把當前信息記錄下來之後,才能夠寫上新的信息。
上述這兩種情況,行政人員和采購員對布告欄的訪問就需要進行同步。因為其中一個線程(行政人員)修改了共享資源(布告欄)。而且我們可以看到,行政人員的工作流程和采購員的工作流程(執行代碼)完全不同,但是由於他們訪問了同一份可變共享資源(布告欄),所以他們之間需要同步。
同步鎖
前面講了為什麼要線程同步,下面我們就來看如何才能線程同步。
線程同步的基本實現思路還是比較容易理解的。我們可以給共享資源加一把鎖,這把鎖只有一把鑰匙。哪個線程獲取了這把鑰匙,才有權利訪問該共享資源。
生活中,我們也可能會遇到這樣的例子。一些超市的外面提供了一些自動儲物箱。每個儲物箱都有一把鎖,一把鑰匙。人們可以使用那些帶有鑰匙的儲物箱,把東西放到儲物箱裡面,把儲物箱鎖上,然後把鑰匙拿走。這樣,該儲物箱就被鎖住了,其他人不能再訪問這個儲物箱。(當然,真實的儲物箱鑰匙是可以被人拿走復制的,所以不要把貴重物品放在超市的儲物箱裡面。於是很多超市都採用了電子密碼鎖。)
線程同步鎖這個模型看起來很直觀。但是,還有一個嚴峻的問題沒有解決,這個同步鎖應該加在哪裡? 當然是加在共享資源上了。反應快的讀者一定會搶先回答。
沒錯,如果可能,我們當然盡量把同步鎖加在共享資源上。一些比較完善的共享資源,比如,文件系統,資料庫系統等,自身都提供了比較完善的同步鎖機制。我們不用另外給這些資源加鎖,這些資源自己就有鎖。
但是,大部分情況下,我們在代碼中訪問的共享資源都是比較簡單的共享對象。這些對象裡面沒有地方讓我們加鎖。
讀者可能會提出建議:為什麼不在每一個對象內部都增加一個新的區域,專門用來加鎖呢?這種設計理論上當然也是可行的。問題在於,線程同步的情況並不是很普遍。如果因為這小概率事件,在所有對象內部都開辟一塊鎖空間,將會帶來極大的空間浪費。得不償失。
於是,現代的編程語言的設計思路都是把同步鎖加在代碼段上。確切的說,是把同步鎖加在「訪問共享資源的代碼段」上。這一點一定要記住,同步鎖是加在代碼段上的。
同步鎖加在代碼段上,就很好地解決了上述的空間浪費問題。但是卻增加了模型的復雜度,也增加了我們的理解難度。
2. 什麼是Java多線程編程
一、 什麼是多線程:
我們現在所使用操作系統都是多任務操作系統(早期使用的DOS操作系統為單任務操作系統),多任務操作指在同一時刻可以同時做多件事(可以同時執行多個程序)。
多進程:每個程序都是一個進程,在操作系統中可以同時執行多個程序,多進程的目的是為了有效的使用CPU資源,每開一個進程系統要為該進程分配相關的系統資源(內存資源)
多線程:線程是進程內部比進程更小的執行單元(執行流|程序片段),每個線程完成一個任務,每個進程內部包含了多個線程每個線程做自己的事情,在進程中的所有線程共享該進程的資源;
主線程:在進程中至少存在一個主線程,其他子線程都由主線程開啟,主線程不一定在其他線程結束後結束,有可能在其他線程結束前結束。Java中的主線程是main線程,是Java的main函數;
繼承Thread類來實現多線程:
二、 Java中實現多線程的方式:
當我們自定義的類繼承Thread類後,該類就為一個線程類,該類為一個獨立的執行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。
run方法中定義的代碼為線程代碼,但run方法不能直接調用,如果直接調用並沒有開啟新的線程而是將run方法交給調用的線程執行
要開啟新的線程需要調用Thread類的start()方法,該方法自動開啟一個新的線程並自動執行run方法中的內容
java多線程的啟動順序不一定是線程執行的順序,各個線程之間是搶佔CPU資源執行的,所有有可能出現與啟動順序不一致的情況。
CPU的調用策略:
如何使用CPU資源是由操作系統來決定的,但操作系統只能決定CPU的使用策略不能控制實際獲得CPU執行權的程序。
線程執行有兩種方式:
1.搶占式:
目前PC機中使用最多的一種方式,線程搶佔CPU的執行權,當一個線程搶到CPU的資源後並不是一直執行到此線程執行結束,而是執行一個時間片後讓出CPU資源,此時同其他線程再次搶佔CPU資源獲得執行權。
2.輪循式;
每個線程執行固定的時間片後讓出CPU資源,以此循環執行每個線程執行相同的時間片後讓出CPU資源交給下一個線程執行。
希望對您有所幫助!~
3. Java線程的概念與原理
一 操作系統中線程和進程的概念
兄缺現在的操作系統是多任務操作系統 多線程是實現多任務的一種方式
進程是指一個內存中運行的應用程序 每個進程都有自己獨立的一塊內存空間 一個進程中可以啟動多個線程 比如在Windows系統中 一個運行的exe就是一個進程 線程是指進程中的一個執行流程 一個進程中可以運行多個線程 比如java exe進程中可以運行很多線程 線程總是屬於某羨畢辯個進程 進程中的多個線程共享進程的內存 同時 執行是人的感覺 在線程之間實際上輪換執行
二 Java中的線程
在Java中 線程 指兩件不同的事情
java lang Thread類的一個實例
線程的執行
使用java lang Thread類或者java lang Runnable介面編寫代碼來定義 實例化和啟動新線程 一個Thread類實例只是一個對象 像Java中的任何其他對象一樣 具有變數和方法 生死於堆上 Java中 每個線程都有一個調用棧 即使不在程序中創建任何新的線程 線程也在後台運行著 一個Java應用總是從main()方法開始運行 mian()方法運行在一個線程內 它被稱為主線程 一旦創建一個新的線程 就產生一個新的調用棧 線程總體分兩類 用戶線程和守候線程
當所有用戶線程執行完畢的時候 JVM自動關閉 但是守候線程卻不獨立於JVM 守候線程一般是由操作系統或者用戶自己創建的
———————————MultiT java——————————————————————
class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
//mt setDaemon(true);//設定為後台線程 main進程結束時 後台進程也跟著結束
//mt setPriority(Thread MAX_PRIORITY); //設定線程優先順序 MAX_PRIORITY為 MIN_PRIORITY為 NORM_PRIORITY為
//設定為最高優先順序後 程序運行時 mt線程一直運行 強制終止時 main線程才運行
//設定為最高優先順序的線程 無論有無yield(); 線程總一直運行 直到強制終止時 main和mt線程交替運行
mt start();
int index= ;
while(true) //顯示結果與教程不同
{
if(index++== )
break;
System out println( main: +Thread currentThread() getName()); //獲取線程名字
}
}
}
class MyThread extends Thread
{
public void run()
{
while(true)
{
System out println(getName());
yield(); //允許當前線程停止 轉去執行其他線程 靜態方法
//mt進程執行時 切換到main進程 main進程執行一段時間數帆後
//切換進程到mt mt執行完獲取名字後 返回到main進程
}
}
}
//一個長時間處於等待狀態的線程也有可能被線程調度器調度 從而運行
//打破高優先順序線程始終獲有運行時間的狀態
——————————————————————————————————————
——————————MultiThread java———————————————————————
class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
//new Thread(mt) start(); //創建多個同樣的線程訪問同一個變數index 若MyThread採用繼承Thread方式 則無法共享同一個變數
//new Thread(mt) start();
//new Thread(mt) start();
//new Thread(mt) start();
mt getThread() start(); //也可以採用內部類的方式共享訪問同一個變數
mt getThread() start();
mt getThread() start();
mt getThread() start();
//mt setDaemon(true);//設定為後台線程 main進程結束時 後台進程也跟著結束
//mt setPriority(Thread MAX_PRIORITY); //設定線程優先順序 MAX_PRIORITY為 MIN_PRIORITY為 NORM_PRIORITY為
//設定為最高優先順序後 程序運行時 mt線程一直運行 強制終止時 main線程才運行
//設定為最高優先順序的線程 無論有無yield(); 線程總一直運行 直到強制終止時 main和mt線程交替運行
//mt start();
int index= ;
while(true) //顯示結果與教程不同
{
// if(index++== )
// break;
System out println( main: +Thread currentThread() getName()); //獲取線程名字
}
}
}
class MyThread //implements Runnable //extends Thread //使用外部類的方式
//使用內部類完成使用Runnable介面才能完成的兩個功能 a 創建多個線程 b 訪問同一個變數
{
int index= ;
private class InnerThread extends Thread //不想讓外部訪問其實現方法 加上private
{
public void run()
{
while(true)
{
System out println(Thread currentThread() getName()+ : +index++);
}
}
}
Thread getThread()
{
return new InnerThread();
}
/*
public void run()
{
while(true)
{
System out println(Thread currentThread() getName()+ : +index++);
//yield(); //允許當前線程停止 轉去執行其他線程 靜態方法
//mt進程執行時 切換到main進程 main進程執行一段時間後
//切換進程到mt mt執行完獲取名字後 返回到main進程
}
}
*/
}
//一個長時間處於等待狀態的線程也有可能被線程調度器調度 從而運行
//打破高優先順序線程始終獲有運行時間的狀態
//如果不需要修改Thread類的除了run方法外的其他方法 選用implements Runnable
———————————————————————————————————————
———————————TicketsSystem java———————————————————
//多線程實現火車票的售票系統 用同步塊 或著同步方法
class TicketsSystem
{
public static void main(String[] args) //運行結果與教程中不同 不完全順序 每次運行 順序都不完全一樣
{
SellThread st=new SellThread();//創建四個線程訪問同一變數tickets
// 錯 SellThread st =new SellThread();//若採用創建四個對象的方式 則每個對象中都有 張票
new Thread(st) start(); //b為false 用的同步方法 | //同步方法與同步塊共用中 顯示的是只調用了同步塊 而同步方法未被調用
//b為true 用的同步塊 | //原因 啟動第一個線程後 CPU時間片沒有到期 線程沒有立即運行 接著執行b=true
// | //解決辦法 啟動第一個線程後 執行一個睡眠時間 讓CPU時間片到期
try
{
Thread sleep( );
}
catch(Exception e)
{
e printStackTrace();
}
st b=true;
new Thread(st) start();
//new Thread(st) start();
//new Thread(st) start();
}
}
class SellThread implements Runnable //程序有點小問題 當剩下最後一張票時 四個線程都運行 可能會出現票數為 (系統長時間運行時)
//可加上一個靜態方法sleep();它會拋出異常
{
int tickets= ;
//Object obj=new Object();//也可以聲明一個Thread對象
Thread th=new Thread();
boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sell();
}
else
{
while(true)
{ //同步方法利用的是this所代表的對象的鎖
synchronized(this) //採用同步後 顯示正確 此方法兩步 聲明Thread對象 用synchronized把原方法括起來
{ //這里換th為this
///*
if(tickets> )
{
try
{
Thread sleep( );
}
catch(Exception e)
{
e printStackTrace();
}
System out println( th +Thread currentThread() getName()+ sell tickets: +tickets);
tickets ;
}
//*/
}
}
}
}
public synchronized void sell() //每個class也有一個鎖 是這個class所對應的class對象的鎖(監視器)
{
if(tickets> )
{
try
{
Thread sleep( );
}
catch(Exception e)
{
e printStackTrace();
}
System out println( sell +Thread currentThread() getName()+ sell tickets: +tickets);
tickets ;
}
}
}
————————————————————————————————————————
———————————TestWN java————————————————————
class Test
{
public static void main(String[] args)
{
Queue q=new Queue();
Procer p=new Procer(q);
Consumer c=new Consumer(q);
p start();
c start();
}
}
class Procer extends Thread
{
Queue q;
Procer(Queue q)
{
this q=q;
}
public void run()
{
for(int i= ;i< ;i++)
{
q put(i);
System out println( Procer put: +i);
}
}
}
class Consumer extends Thread
{
Queue q;
Consumer(Queue q)
{
this q=q;
}
public void run()
{
while(true)
{
System out println( Consumer get: +q get());
}
}
}
class Queue //wait notify 方法必須用在同步方法中 要加上關鍵字synchronized
{
int value;
boolean bFull=false;
public synchronized void put(int i)
{
if(!bFull)
{
value=i;
bFull=true;
notify();
}
try
{
wait();
}
catch(Exception e)
{
e printStackTrace();
}
}
public synchronized int get()
{
if(!bFull)
{
try
{
wait();
}
catch(Exception e)
{
e printStackTrace();
}
}
bFull=false;
notify();
return value;
}
}
————————————————————————————————————
————————————TestThread java———————————————————————
class TestThread
{
public static void main(String[] args)
{
Thread t =new Thread ();
t start();
int index= ;
while(true)
{
if(index++== )
{
t stopThread();
t interrupt(); //讓線程 終止
break;
}
System out println(Thread currentThread() getName());
}
System out println( main() exit );
}
}
class Thread extends Thread
{
private boolean bStop=false;
public synchronized void run()
{
while(!bStop)
{
try
{
wait(); //加入wait後 main線程結束時 程序還未終止 原因是Thread 的線程調用wait方法 進入對象的等待隊列中 需要notify方法將它喚醒
}
catch(Exception e)
{
//e printStackTrace();
if(bStop)
return;
}
System out println(getName());
}
}
public void stopThread()
{
bStop=true;
}
}
lishixin/Article/program/Java/gj/201311/27407
4. Java多線程是什麼意思
Java多線程實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。
1、繼承Thread類實現多線程
繼承Thread類的方法盡管被我列為一種多線程實現方式,但Thread本質上也是實現了Runnable介面的一個實例,它代表一個線程的實例,並且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。例如:
代碼說明:
上述代碼中Executors類,提供了一系列工廠方法用於創先線程池,返回的線程池都實現了ExecutorService介面。
public static ExecutorService newFixedThreadPool(int nThreads)
創建固定數目線程的線程池。
public static ExecutorService newCachedThreadPool()
創建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鍾未被使用的線程。
public static ExecutorService newSingleThreadExecutor()
創建一個單線程化的Executor。
public static ScheledExecutorService newScheledThreadPool(int corePoolSize)
創建一個支持定時及周期性的任務執行的線程池,多數情況下可用來替代Timer類。
總結:ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor後台線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。
5. java中什麼叫做線程什麼叫多線程多線程的特點是什麼
在 Java 中,線程(Thread)是指程序執行的一條路徑,是進程中的一個實體。Java 中的線程是輕量級的,可以同時運行多個線程,這就是多線程(Multithreading)。
多線程是指在一個程序中同時運行多個線程,每個線程都可以獨立執行不同的任務。多線程的特點包括:
提高程序的並發性:多線程可以讓程序同時執行多個任務,提高程序的並發性,從而提高程序的效率。
提旅凱毀高程序的響應性:多線程可以讓程序拆備在執行耗時操作時不會阻塞,從孫隱而提高程序的響應性,使用戶能夠更快地得到反饋。
充分利用 CPU 資源:多線程可以讓程序充分利用 CPU 資源,提高 CPU 的利用率,從而提高程序的效率。
方便處理復雜的任務:多線程可以讓程序同時處理多個復雜的任務,從而方便處理復雜的任務。
需要注意的是,多線程也會帶來一些問題,例如線程安全問題、死鎖問題等,因此在編寫多線程程序時需要注意這些問題。
6. java多線程詳細理解
多線程:指的是這個程序(一個進程)運行時產生了不止一個線程
並行與並發:
並行:多個cpu實例或者多台機器同時執行一段處理邏輯,是真正的同時。
並發:通過cpu調度演算法,讓用戶看上去同時執行,實際上從cpu操作層面不是真正的同時。並發往往在場景中有公用的資源,那麼針對這個公用的資源往往產生瓶頸,我們會用TPS或者QPS來反應這個系統的處理能力。
線程安全:經常用來描繪一段代碼。指在並發的情況之下,該代碼經過多線程使用,線程的調度順序不影響任何結果。這個時候使用多線程,我們只需要關注系統的內存,cpu是不是夠用即可。反過來,線程不安全就意味著線程的調度順序會影響最終結果,如不加事務的轉賬代碼:
同步:Java中的同步指的是通過人為的控制和調度,保證共享資源的多線程訪問成為線程安全,來保證結果的准確。如上面的代碼簡單加入@synchronized關鍵字。在保證結果准確的同時,提高性能,才是優秀的程序。線程安全的優先順序高於性能。
7. java中什麼叫做線程什麼叫多線程多線程的特點是什麼
線程的概念:Thread 每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態執行。
多線程的概念: 多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。
多線程的特點:使用線程可以把占據長時間的程序中的任務放到後台去處理
用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度 。
程序的運行速度可能加快 ·在一些等待的任務實現上如用戶輸入、文件讀寫和網路收發數據等,線程就比較有用了。
在這種情況下我們可以釋放一些珍貴的資源如內存佔用等等。
8. 什麼是Java多線程
多線程的概念?
說起多線程,那麼就不得不說什麼是線程,而說起線程,又不得不說什麼是進程。
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
進程可以簡單的理解為一個可以獨立運行的程序單位。它是線程的集合,進程就是有一個或多個線程構成的,每一個線程都是進程中的一條執行路徑。
那麼多線程就很容易理解:多線程就是指一個進程中同時有多個執行路徑(線程)正在執行。
為什麼要使用多線程?
1.在一個程序中,有很多的操作是非常耗時的,如資料庫讀寫操作,IO操作等,如果使用單線程,那麼程序就必須等待這些操作執行完成之後才能執行其他操作。使用多線程,可以在將耗時任務放在後台繼續執行的同時,同時執行其他操作。
2.可以提高程序的效率。
3.在一些等待的任務上,如用戶輸入,文件讀取等,多線程就非常有用了。
缺點:
1.使用太多線程,是很耗系統資源,因為線程需要開辟內存。更多線程需要更多內存。
2.影響系統性能,因為操作系統需要在線程之間來回切換。
3.需要考慮線程操作對程序的影響,如線程掛起,中止等操作對程序的影響。
4.線程使用不當會發生很多問題。
總結:多線程是非同步的,但這不代表多線程真的是幾個線程是在同時進行,實際上是系統不斷地在各個線程之間來回的切換(因為系統切換的速度非常的快,所以給我們在同時運行的錯覺)。
2.多線程與高並發的聯系。
高並發:高並發指的是一種系統運行過程中遇到的一種「短時間內遇到大量操作請求」的情況,主要發生在web系統集中大量訪問或者socket埠集中性收到大量請求(例如:12306的搶票情況;天貓雙十一活動)。該情況的發生會導致系統在這段時間內執行大量操作,例如對資源的請求,資料庫的操作等。如果高並發處理不好,不僅僅降低了用戶的體驗度(請求響應時間過長),同時可能導致系統宕機,嚴重的甚至導致OOM異常,系統停止工作等。如果要想系統能夠適應高並發狀態,則需要從各個方面進行系統優化,包括,硬體、網路、系統架構、開發語言的選取、數據結構的運用、演算法優化、資料庫優化……。
而多線程只是在同/非同步角度上解決高並發問題的其中的一個方法手段,是在同一時刻利用計算機閑置資源的一種方式。
多線程在高並發問題中的作用就是充分利用計算機資源,使計算機的資源在每一時刻都能達到最大的利用率,不至於浪費計算機資源使其閑置。
3.線程的創建,停止,常用方法介紹。
1.線程的創建:
線程創建主要有2種方式,一種是繼承Thread類,重寫run方法即可;(Thread類實現了Runable介面)
另一種則是實現Runable介面,也需要重寫run方法。
線程的啟動,調用start()方法即可。 我們也可以直接使用線程對象的run方法,不過直接使用,run方法就只是一個普通的方法了。
其他的還有: 通過匿名內部類的方法創建;實現Callable介面。。。。。
2.線程常用方法:
currentThread()方法:該方法返回當前線程的信息 .getName()可以返回線程名稱。
isAlive()方法:該方法判斷當前線程是否處於活動狀態。
sleep()方法:該方法是讓「當前正在執行的線程「休眠指定的時間,正在執行的線程是指this.currentThread()返回的線程。
getId()方法:該方法是獲取線程的唯一標識。
3.線程的停止:
在java中,停止線程並不簡單,不想for。。break那樣說停就停,需要一定的技巧。
線程的停止有3種方法:
1.線程正常終止,即run()方法運行結束正常停止。
2.使用interrupt方法中斷線程。
3.使用stop方法暴力停止線程。
interrupt方法中斷線程介紹:
interrupt方法其實並不是直接中斷線程,只是給線程添加一個中斷標志。
判斷線程是否是停止狀態:
this.interrupted(); 判斷當前線程是否已經中斷。(判斷的是這個方法所在的代碼對應的線程,而不是調用對象對應的線程)
this.isInterrupted(); 判斷線程是否已經中斷。(誰調用,判斷誰)
註:.interrupted()與isInterrupted()的區別:
interrupted()方法判斷的是所在代碼對應的線程是否中斷,而後者判斷的是調用對象對應的線程是否停止
前者執行後有清除狀態的功能(如連續調用兩次時,第一次返回true,則第二次會返回false)
後者沒有清除狀態的功能(兩次返回都為true)
真正停止線程的方法:
異常法:
在run方法中 使用 this.interrupted();判斷線程終止狀態,如果為true則 throw new interruptedException()然後捕獲該異常即可停止線程。
return停止線程:
在run方法中 使用 this.interrupted();判斷線程終止狀態,如果為true則return停止線程。 (建議使用異常法停止線程,因為還可以在catch中使線程向上拋,讓線程停止的事件得以傳播)。
暴力法:
使用stop()方法強行停止線程(強烈不建議使用,會造成很多不可預估的後果,已經被標記為過時)
(使用stop方法會拋出 java.lang.ThreadDeath 異常,並且stop方法會釋放鎖,很容易造成數據不一致)
註:在休眠中停止線程:
在sleep狀態下停止線程 會報異常,並且會清除線程狀態值為false;
先停止後sleep,同樣會報異常 sleep interrupted;
4.守護線程。
希望對您有所幫助!~