Java学习手记2——多线程
一.線程的概念
CPU執(zhí)行程序,就好比一個(gè)人在干事情一樣,同一個(gè)時(shí)間你只能做一件事情,但是這樣的效率實(shí)在是太低了,在你用電腦的時(shí)候,聽(tīng)歌就不能瀏覽網(wǎng)頁(yè),看電影就不能下載視頻,你想想是不是很蛋疼。
所以為了解決這個(gè)問(wèn)題,CPU設(shè)計(jì)成了分時(shí)處理的方式,即不同的時(shí)間CPU做不同的事情,這樣就大大提高了效率,能這樣做的原因是因?yàn)镃PU相對(duì)于人的接收信息的速度,快得多!也就是說(shuō),你邊聽(tīng)歌邊瀏覽網(wǎng)頁(yè),看上去好像音樂(lè)播放器和瀏覽器兩個(gè)程序在同時(shí)工作,其實(shí)他們是分時(shí)在工作,即播放器工作一會(huì),瀏覽器工作一會(huì),這樣交叉執(zhí)行的,只不過(guò)是你接受信息的速度很慢,所以感覺(jué)不到而已。
那么多線程,和多個(gè)程序是一樣的道理,多線程是一個(gè)程序內(nèi)部的多個(gè)子任務(wù)分時(shí)執(zhí)行。比如:qq的視頻聊天,你可以邊看視頻,邊發(fā)消息,這就是兩個(gè)線程。
PS:另外,好多人解釋進(jìn)程和線程的區(qū)別,用一大堆抽象的概念,說(shuō)的跟沒(méi)說(shuō)一樣,晦澀難懂,在我看來(lái),進(jìn)程和線程都是運(yùn)行著的程序,只不過(guò)進(jìn)程是運(yùn)行著的獨(dú)立的程序(比如:QQ,LOL,QQ影音),而線程是一個(gè)獨(dú)立的程序里面的運(yùn)行著的子程序(比如:QQ里的首發(fā)消息,收發(fā)加播放視頻,上下載文件等),如果把線程抽離出來(lái),也是一個(gè)進(jìn)程。之所以拿這兩個(gè)比較,還有一個(gè)原因是他們的另外一個(gè)共同點(diǎn):都是分時(shí)執(zhí)行的。即進(jìn)程是不同程序的分時(shí)執(zhí)行(比如用QQ的同時(shí)可以玩LOL),而線程是一個(gè)程序內(nèi)部多個(gè)子程序的分時(shí)執(zhí)行(比如用QQ聊天的時(shí)候可以接受并播放對(duì)方攝像頭傳過(guò)來(lái)的視頻,同時(shí)還可以上下載文件)。
二.Java中的線程的實(shí)現(xiàn)方式
在Java中,實(shí)現(xiàn)多線程有兩種方式:
1.繼承 Thread類
細(xì)節(jié):繼承Thread類之后,重寫run()方法,把要實(shí)現(xiàn)多線程的代碼敲進(jìn)run()方法里,然后在main函數(shù)中實(shí)例化這個(gè)類(即之前繼承并重寫run()方法的類)的對(duì)象,并調(diào)用繼承的start()方法,從該方法調(diào)用的地方開(kāi)始,CPU便會(huì)利用空閑時(shí)間段執(zhí)行run()里的程序代碼。
1 import java.lang.*; 2 public class TestThread extends Thread{ 3 4 public void run(){ 5 System.out.println(Thread.currentThread().getName()); 6 } 7 8 9 public static void main(String[] args) { 10 Thread tt = new TestThread(); 11 tt.start();//這里啟動(dòng)了另一個(gè)線程 12 System.out.println(Thread.currentThread().getName()); 13 } 14 15 }運(yùn)行結(jié)果:
main Thread-0?
2.實(shí)現(xiàn)Runable接口
細(xì)節(jié):Thread這個(gè)類,構(gòu)造方法有兩個(gè):Thread()和Thread(Runnable target)。
這里介紹第二個(gè)構(gòu)造方法Thread(Runable target),這個(gè)Runnable是一個(gè)接口,接口里面定義了一個(gè)run()方法,可以將一個(gè)類引用這個(gè)接口,實(shí)現(xiàn)其中的run()方法,將需要多線程執(zhí)行的代碼放入run()方法中,然后用第二個(gè)構(gòu)造方法調(diào)用這個(gè)實(shí)現(xiàn)了Runnable接口的類。不得不說(shuō)接口是個(gè)神器
1 import java.lang.*; 2 public class TestThread implements Runnable{ 3 4 public void run(){ 5 System.out.println(Thread.currentThread().getName()); 6 } 7 8 9 public static void main(String[] args) { 10 Thread tt = new Thread(new TestThread()); 11 tt.start(); 12 System.out.println(Thread.currentThread().getName()); 13 } 14 15 }運(yùn)行結(jié)果:
main Thread-03.這兩種方式的區(qū)別
- Java中的類只能是單繼承,所以當(dāng)一個(gè)類已經(jīng)是繼承別個(gè)類的子類,又要加入多線程,就要用第二種實(shí)現(xiàn)Runnable接口的方法
- 由于兩者構(gòu)造方式不同,第一種方式每次都是新建對(duì)象來(lái)實(shí)現(xiàn)多線程,而第二種方式可以使多個(gè)線程共享一個(gè)對(duì)象(實(shí)現(xiàn)了Runnable接口的類的對(duì)象)的資源,可以根據(jù)情況來(lái)使用。
例如:模擬一個(gè)售票的過(guò)程,一共有一百?gòu)埰?#xff0c;三個(gè)人分別售票。
1 import java.lang.*; 2 public class TestThread implements Runnable{ 3 private int num = 100; 4 public void run(){ 5 while(num-->=0) 6 System.out.println(Thread.currentThread().getName()+':'+num); 7 return; 8 } 9 10 11 public static void main(String[] args) { 12 TextThread tt = new TestThread(); 13 new Thread(tt).start(); 14 new Thread(tt).start(); 15 new Thread(tt).start(); 16 System.out.println(Thread.currentThread().getName()); 17 } 18 19 }運(yùn)行部分結(jié)果:
Thread-2:91 Thread-2:90 Thread-2:89 Thread-2:88 Thread-2:87 Thread-1:86 Thread-1:84 Thread-1:83三.Thread類中一些其他的方法
?static Thread curruntThread() 返回當(dāng)前正在執(zhí)行的線程對(duì)象的引用
String getName() 返回該線程名稱
void join() 在當(dāng)前位置插入該線程
void join(long millis) 在當(dāng)前位置插入該線程執(zhí)行millis毫秒,繼續(xù)之前的線程
?
2016-08-26?01:16:19
轉(zhuǎn)載于:https://www.cnblogs.com/jizhji/p/5808836.html
總結(jié)
以上是生活随笔為你收集整理的Java学习手记2——多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MongoDB和MySQL的区别
- 下一篇: C++学习19 类的多继承