PS:又開始忙叨JAVA了。。前一陣子搞定了HTML+CSS,要開始寫實(shí)驗(yàn)室的界面了,真沒勁。。。博客到時(shí)候再更新吧!
先更新JAVA的吧。。。
多線程(一)
主要內(nèi)容
1.JAVA中的線程
2.用Thread子類創(chuàng)建線程
3.使用Runnable接口
4.了解線程的并發(fā)性
進(jìn)程:進(jìn)程是程序的一次動(dòng)態(tài)的執(zhí)行過程,它對應(yīng)了從代碼加載,執(zhí)行至執(zhí)行完畢的一個(gè)完成過程,這個(gè)過程也是進(jìn)程
本身從產(chǎn)生發(fā)展和消亡的過程.簡單的說就是一個(gè)程序,比如說我們打開一個(gè)瀏覽器,那么這個(gè)瀏覽器就加載到了我們的
操作系統(tǒng)中,從而就變成了一個(gè)進(jìn)程,那么線程是什么,線程就是內(nèi)嵌在進(jìn)程中的,一個(gè)進(jìn)程可以有多個(gè)線程,就拿瀏覽
器來說吧。。我們在打開瀏覽器的同時(shí),可以變?yōu)g覽著網(wǎng)頁,也可以在瀏覽器中播放音樂。還可以同時(shí)下載文件。那么這
就是一個(gè)瀏覽器進(jìn)程所包含的多個(gè)線程.
1.JAVA的線程
/* * */public class Demo_1_1 { public static void main(String[] args) { speakhello sh=new speakhello(); speaknihao sn=new speaknihao(); sh.start(); sn.start(); for(int i=1;i<=20;i++) System.out.上述代碼的執(zhí)行結(jié)果是隨機(jī)的。。我隨機(jī)截了圖。。
上面的結(jié)果是speakhello線程先執(zhí)行,然后主線程執(zhí)行了三次,然后speakhello執(zhí)行,依次類推.這是因?yàn)镴VM已知有三個(gè)線程,
主線程和speakhello以及speaknihao三個(gè)線程,CPU在這三個(gè)線程中進(jìn)行切換,切換的速度也是非常的快速的。是我們無法想象
的快。。當(dāng)三個(gè)線程完全都執(zhí)行完畢后,JVM才不會(huì)再分配CPU。。。
2.Thread方法創(chuàng)建線程以及實(shí)現(xiàn)Runnable接口創(chuàng)建線程
Thread方法和Runnable都可以創(chuàng)建線程,但是更加常用的是Runnable接口重寫run()方法,而不是繼承Thread類重寫run()
原因是JAVA不支持多繼承,繼承了Thread類以后不能再次擴(kuò)展其他的類,而Runnable屬于接口類型,一個(gè)接口可以有多個(gè)類進(jìn)行
實(shí)現(xiàn).
上面的那個(gè)代碼就是繼承了Thread類來覆蓋了run()方法來創(chuàng)建線程。
賣票問題:
public class ticket { public static void main(String[] args) { //啟動(dòng)了三個(gè)窗口去賣票 windows s1=new windows(); windows s2=new windows(); windows s3=new windows(); Thread t1=new Thread(s1); Thread t2=new Thread(s2); Thread t3=new Thread(s3); t1.start();t2.start(); t3.start(); }}class windows implements Runnable{ private int num=100; // private static int num=100; public void run() { while(true) { try { Thread.sleep(1000);//每隔一秒出票 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(num>0) { System.out.println("正在出售第"+num+"張票"); num--; } else { break; } } }}上面結(jié)果的運(yùn)行就是每個(gè)窗口各自賣各自的票,num沒有實(shí)現(xiàn)共享,就好像是一個(gè)窗口是賣飛機(jī)票的
另一個(gè)是賣火車票的,最后一個(gè)窗口是賣客車票的,總而言之就是每個(gè)窗口都分配了100張票,讓他
們?nèi)ベu。。。。
一種方法就是把上面的代碼做一下修改。。。如上圖的注釋部分,把num改成靜態(tài)的,那么這三個(gè)窗口
就會(huì)共享這100張票了,還有一種方法就是下面把num封裝成一個(gè)對象,然后啟動(dòng)三個(gè)線程實(shí)現(xiàn)共享。。
public class ticket1 { public static void main(String[] args) { sel s=new sel(); Thread t1=new Thread(s); Thread t2=new Thread(s); Thread t3=new Thread(s); t1.start();t2.start(); t3.start(); }}/*買票*/class sel implements Runnable{ private int num=50; public void run() { while(true) { if(num>0) { try { Thread.sleep(1000); }catch(Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" 正在銷售第 "+num+"張票 "+num--); } else { break; } } }}上述的代碼就實(shí)現(xiàn)了這100張票就被這三個(gè)窗口共享了,但是上面的代碼如果把try-catch語句放在循環(huán)的while的下面
那么就會(huì)線程就會(huì)出事了,會(huì)出現(xiàn)的問題就是,同一張票被賣了多次,而有的票還沒有被賣就沒了,甚至可能出現(xiàn)賣第
0張票的可能。。
那么這是什么原因呢?這就是線程的并發(fā)性所導(dǎo)致的問題。。。。。。
新聞熱點(diǎn)
疑難解答
圖片精選