国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JAVA 多線程機(jī)制(一)

2019-11-14 23:36:00
字體:
供稿:網(wǎng)友
java 多線程機(jī)制(一)

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)致的問題。。。。。。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 剑阁县| 元朗区| 土默特左旗| 新乐市| 嘉荫县| 海城市| 芦山县| 河北省| 鄂州市| 和政县| 怀安县| 会泽县| 孝昌县| 温州市| 农安县| 精河县| 兴海县| 岚皋县| 富顺县| 舒兰市| 贵阳市| 商洛市| 五寨县| 双桥区| 如皋市| 海丰县| 嘉黎县| 收藏| 定陶县| 南华县| 西宁市| 民乐县| 玉门市| 八宿县| 湘阴县| 无极县| 九台市| 闻喜县| 乐平市| 北碚区| 平和县|