PS:又開始忙叨JAVA了。。前一陣子搞定了HTML+CSS,要開始寫實驗室的界面了,真沒勁。。。博客到時候再更新吧!
先更新JAVA的吧。。。
多線程(一)
主要內容
1.JAVA中的線程
2.用Thread子類創建線程
3.使用Runnable接口
4.了解線程的并發性
進程:進程是程序的一次動態的執行過程,它對應了從代碼加載,執行至執行完畢的一個完成過程,這個過程也是進程
本身從產生發展和消亡的過程.簡單的說就是一個程序,比如說我們打開一個瀏覽器,那么這個瀏覽器就加載到了我們的
操作系統中,從而就變成了一個進程,那么線程是什么,線程就是內嵌在進程中的,一個進程可以有多個線程,就拿瀏覽
器來說吧。。我們在打開瀏覽器的同時,可以變瀏覽著網頁,也可以在瀏覽器中播放音樂。還可以同時下載文件。那么這
就是一個瀏覽器進程所包含的多個線程.
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.上述代碼的執行結果是隨機的。。我隨機截了圖。。
上面的結果是speakhello線程先執行,然后主線程執行了三次,然后speakhello執行,依次類推.這是因為JVM已知有三個線程,
主線程和speakhello以及speaknihao三個線程,CPU在這三個線程中進行切換,切換的速度也是非常的快速的。是我們無法想象
的快。。當三個線程完全都執行完畢后,JVM才不會再分配CPU。。。
2.Thread方法創建線程以及實現Runnable接口創建線程
Thread方法和Runnable都可以創建線程,但是更加常用的是Runnable接口重寫run()方法,而不是繼承Thread類重寫run()
原因是JAVA不支持多繼承,繼承了Thread類以后不能再次擴展其他的類,而Runnable屬于接口類型,一個接口可以有多個類進行
實現.
上面的那個代碼就是繼承了Thread類來覆蓋了run()方法來創建線程。
賣票問題:
public class ticket { public static void main(String[] args) { //啟動了三個窗口去賣票 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; } } }}上面結果的運行就是每個窗口各自賣各自的票,num沒有實現共享,就好像是一個窗口是賣飛機票的
另一個是賣火車票的,最后一個窗口是賣客車票的,總而言之就是每個窗口都分配了100張票,讓他
們去賣。。。。
一種方法就是把上面的代碼做一下修改。。。如上圖的注釋部分,把num改成靜態的,那么這三個窗口
就會共享這100張票了,還有一種方法就是下面把num封裝成一個對象,然后啟動三個線程實現共享。。
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; } } }}上述的代碼就實現了這100張票就被這三個窗口共享了,但是上面的代碼如果把try-catch語句放在循環的while的下面
那么就會線程就會出事了,會出現的問題就是,同一張票被賣了多次,而有的票還沒有被賣就沒了,甚至可能出現賣第
0張票的可能。。
那么這是什么原因呢?這就是線程的并發性所導致的問題。。。。。。
新聞熱點
疑難解答