線程Thread的5狀態(tài):
創(chuàng)建——>就緒——>運(yùn)行——>阻塞——>停止
創(chuàng)建:new
就緒:創(chuàng)建對象后种吸,執(zhí)行start方法,即加入線程隊(duì)列等待獲取CPU資源呀非。這個時候?yàn)榫途w狀態(tài)坚俗。
運(yùn)行:搶奪到CPU時間片镜盯,該thread開始運(yùn)行run中的代碼。
阻塞:如果在run方法中執(zhí)行了sleep或者調(diào)用了thread的wait/join方法猖败,意味著放棄CPU資源而進(jìn)入阻塞狀態(tài)速缆,但是運(yùn)行還沒有完畢,等待重新獲得CPU資源后恩闻,重新進(jìn)入就緒狀態(tài)
停止:一般停止線程有兩種方式:1執(zhí)行完畢run方法艺糜,2調(diào)用stop方法,后者不推薦使用幢尚∑仆#可以在run方法中循環(huán)檢查某個public變量,當(dāng)想要停止該線程時候尉剩,通過thread.para為false即可以將run提前運(yùn)行完畢真慢,即進(jìn)入了停止?fàn)顟B(tài)
1. 關(guān)于線程創(chuàng)建問題
多線程可以通過兩種方式來創(chuàng)建。
一理茎、通過繼承Thread類
二黑界、通過實(shí)現(xiàn)Runnable接口
java:單繼承多實(shí)現(xiàn)
2. 多線程有哪些優(yōu)點(diǎn)呢?
一皂林、多線程共享同一塊內(nèi)存空間和一組系統(tǒng)資源
二朗鸠、線程本身的數(shù)據(jù)通常都是只有微處理器的寄存器數(shù)據(jù),以及供程序執(zhí)行的堆棧础倍。所以系統(tǒng)在產(chǎn)生一個線程或者線程的切換要比進(jìn)程系統(tǒng)的負(fù)擔(dān)小很多烛占。
3. 關(guān)于共享數(shù)據(jù)的問題比較
Thread:多個線程分別完成自己的任務(wù)
Runnable:多個線程共同完成一個任務(wù)。
Thread:
- 自定義一個類ThreadTest 繼承Thread
- new ThreadTest.start(); /可以創(chuàng)建多個ThreadTest實(shí)例并且啟動著隆,/
public class ThreadDemo
{
public static void main(String []args)
{
MyThread thread1 = new MyThread ();
MyThread thread2 = new MyThread ()
MyThread thread3 = new MyThread ();
MyThread thread4 = new MyThread ();
thread1.start()扰楼;
thread2.start()呀癣;
thread3.start()美浦;
thread4.start();
}
}
class MyThread extends Thread
{
int things = 5;
public void run() {
while(things > 0)
{
System.out.println(currentThread().getName() + " things:" + things); things--;
}
}
}
結(jié)果如下:
Thread-0 things:5
Thread-0 things:4
Thread-2 things:5
Thread-1 things:5
Thread-1 things:4
Thread-1 things:3
Thread-1 things:2
Thread-1 things:1
Thread-2 things:4
Thread-2 things:3
Thread-2 things:2
Thread-2 things:1
Thread-0 things:3
Thread-0 things:2
Thread-0 things:1
-->運(yùn)行后會發(fā)現(xiàn)项栏,多個線程對象各自占有各自的資源浦辨,并且去爭奪CPU時間片去完成各自的線程,并不是同時完成統(tǒng)一的任務(wù)沼沈,所以得出結(jié)論:Thread類實(shí)際無法達(dá)到資源共享的目的
Runnable:
- 自定義一個類ThreadTest實(shí)現(xiàn)Runnable接口
- new Thread(test).start();
此處是new 一個線程畢竟傳入實(shí)現(xiàn)了Runnable的類實(shí)例作為參數(shù)
public class ThreadDemo
{
public static void main(String []args)
{
MyRunnable run = new MyRunnable("run");
Thread th1 = new Thread(run, "Thread 1");
Thread th2 = new Thread(run, "Thread 2");
Thread th3 = new Thread(run, "Thread 3");
th1.start();
th2.start();
th3.start();
}
}
class MyRunnable implements Runnable
{
String name;
public MyRunnable(String name)
{
this.name = name;
}
int things = 5;
public void run()
{
while(things >0)
{
System.out.println(name + " things:" + things);
}
}
}
run things:3
run things:2
run things:1
run things:0
run things:3
-->運(yùn)行后會發(fā)現(xiàn)流酬,運(yùn)行之后我們發(fā)現(xiàn),這三個線程使用同一資源同時(即合作)完成了我們需要完成的任務(wù)列另。芽腾,所以得出結(jié)論:Runnable是可以共享數(shù)據(jù)的,多個Thread可以同時加載一個Runnable页衙,當(dāng)各自Thread獲得CPU時間片的時候開始運(yùn)行runnable摊滔,runnable里面的資源是被共享的
通過以上比較我們即可得出Thread與Runnable的區(qū)別:
1阴绢、Runnable適合于多個相同程序代碼線程去處理統(tǒng)一資源的情況,把虛擬的cpu(線程)同程序的代碼艰躺,數(shù)據(jù)有效分離呻袭,較好體現(xiàn)面向?qū)ο蟮木幊痰乃枷?
2、Runnable可以避免由于Java的單繼承機(jī)制帶來的局限腺兴∽蟮纾可以再繼承其他類的同時,還能實(shí)現(xiàn)多線程的功能页响。
3篓足、Runnable能增加程序的健壯性。代碼能夠被多個線程共享闰蚕。