亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Java多線程機(jī)制及其在socket編程中的應(yīng)用

        2018-03-29 00:30:36鄭逸凡
        關(guān)鍵詞:服務(wù)器端線程進(jìn)程

        鄭逸凡

        (福州外語(yǔ)外貿(mào)學(xué)院,福建 福州 350202)

        1 進(jìn)程與線程

        在操作系統(tǒng)中,進(jìn)程是程序的一次執(zhí)行,比如當(dāng)雙擊某個(gè)可執(zhí)行文件后,系統(tǒng)就創(chuàng)建一個(gè)進(jìn)程專門(mén)執(zhí)行這個(gè)程序的代碼,在執(zhí)行過(guò)程中,進(jìn)程會(huì)申請(qǐng)、持有或釋放操作系統(tǒng)資源(文件、內(nèi)存等).在操作系統(tǒng)發(fā)展早期,進(jìn)程是資源分配、調(diào)度、執(zhí)行的基本單位,但由于進(jìn)程持有系統(tǒng)資源等,調(diào)度時(shí)系統(tǒng)開(kāi)銷很大,于是便出現(xiàn)了輕量級(jí)進(jìn)程——線程.

        一個(gè)進(jìn)程可擁有多個(gè)線程,這些線程共享此進(jìn)程所持有的系統(tǒng)資源.現(xiàn)代操作系統(tǒng)中,調(diào)度、執(zhí)行的基本單位變成了線程,進(jìn)程則還是資源分配的基本單位.由于線程本身幾乎不持有系統(tǒng)資源,在調(diào)度時(shí)系統(tǒng)開(kāi)銷就很小.操作系統(tǒng)可以擁有多個(gè)進(jìn)程,感覺(jué)就像多個(gè)程序同時(shí)在執(zhí)行;進(jìn)程可以擁有多個(gè)線程,感覺(jué)就像一個(gè)程序可以同時(shí)做多件事情.

        2 Java中的多線程API

        多線程編程是指讓程序使用多個(gè)線程同時(shí)分別做一件事情的不同部分,或者同時(shí)做不同的事情,但并不是所有的事情都適合多線程,多線程編程的目的是提高程序執(zhí)行效率、提高人們的工作效率.

        2.1 繼承Thread類創(chuàng)建線程

        在Java中,Thread類是所有線程類的超類,開(kāi)發(fā)人員可以編寫(xiě)一個(gè)類繼承Thread,并重寫(xiě)run方法,在run方法里面編寫(xiě)線程將要執(zhí)行的代碼.創(chuàng)建線程對(duì)象后,只需要調(diào)用start()方法即可讓線程進(jìn)入就緒隊(duì)列,等待操作系統(tǒng)調(diào)度.需要特別注意的是調(diào)度具有隨機(jī)性和隨時(shí)性,也就是說(shuō)無(wú)法確定下一次調(diào)度哪個(gè)線程,也無(wú)法確定什么時(shí)刻進(jìn)行調(diào)度.在Java中,繼承Thread類創(chuàng)建線程的代碼如下:

        public class ThreadTest{

        public static void main(String[]args){

        MyThread myThread=new MyThread();

        myThread.start();

        }

        }

        class MyThread extends Thread{

        @Override

        public void run(){

        System.out.println("自己創(chuàng)建的線程執(zhí)行了");

        }

        }

        2.2 實(shí)現(xiàn)Runnable接口創(chuàng)建線程

        除了繼承Thread類重寫(xiě)run方法外,在簡(jiǎn)單的情況下,還可通過(guò)實(shí)現(xiàn)Runnable接口的方式編寫(xiě)線程執(zhí)行的代碼,具體實(shí)現(xiàn)代碼如下:

        Thread thread=new Thread(new Runnable(){

        @Override

        public void run(){

        System.out.println("Runnable接口方式實(shí)現(xiàn)多線程");

        }

        });

        3 線程安全及同步控制

        一個(gè)數(shù)據(jù),如一個(gè)對(duì)象或?qū)ο笾械哪硞€(gè)字段,如果有多個(gè)線程可以同時(shí)訪問(wèn)它,就可能會(huì)出現(xiàn)線程安全問(wèn)題:數(shù)據(jù)錯(cuò)亂、程序出錯(cuò)或其他無(wú)法預(yù)知的問(wèn)題.比如線程1要遍歷一個(gè)list集合,線程2要把這個(gè)list集合清空,如果這兩個(gè)線程同時(shí)執(zhí)行就可能會(huì)出現(xiàn)線程安全問(wèn)題.線程同步控制,即使用某種方式使得一個(gè)線程在操作完某個(gè)數(shù)據(jù)前,別的線程無(wú)法操作這個(gè)數(shù)據(jù),從而避免多個(gè)線程同時(shí)操作一個(gè)數(shù)據(jù),進(jìn)而避免線程安全問(wèn)題.

        3.1 synchronized同步鎖機(jī)制

        在Java中每個(gè)對(duì)象都有一把鎖,同一時(shí)刻只能有一個(gè)線程持有這把鎖,線程可以使用synchronized關(guān)鍵字向系統(tǒng)申請(qǐng)某個(gè)對(duì)象的鎖,得到鎖之后,別的線程再申請(qǐng)?jiān)撴i時(shí),就只能等待.持有鎖的線程在這次操作完成后,可以釋放鎖,以便其他線程可以獲得鎖.例如,以synchronized代碼塊實(shí)現(xiàn)同步鎖機(jī)制的主要代碼如下:

        Thread thread1=new Thread(new Runnable(){

        @Override

        public void run(){

        synchronized(list){

        for(int i=0;i<list.size();i++){

        System.out.println(list.get(i));

        }

        }

        }

        });

        Thread thread2=new Thread(new Runnable(){

        @Override

        public void run(){

        synchronized(list){

        list.clear();

        }

        }

        });

        3.2 wait/notify等待/通知機(jī)制

        對(duì)于稍復(fù)雜的情況,比如多個(gè)線程需要相互合作有規(guī)律的訪問(wèn)共享數(shù)據(jù),就可以使用wait/notify機(jī)制,即等待/通知機(jī)制,也稱等待/喚醒機(jī)制.

        等待/通知機(jī)制建立在synchronized同步鎖機(jī)制的基礎(chǔ)上,即在同步代碼塊(或同步方法)內(nèi),如果當(dāng)前線程執(zhí)行了lockObject.wait()(lockObject表示提供鎖的對(duì)象),則當(dāng)前線程立即暫停執(zhí)行,并被放入阻塞隊(duì)列,并向系統(tǒng)歸還所持有的鎖,并在lockObject上等待,直到別的線程調(diào)用lockObject.notify().如果有多個(gè)線程在同一個(gè)對(duì)象上等待,notify()方法只會(huì)隨機(jī)通知一個(gè)等待的線程,也可以使用notifyAll()方法通知所有等待的線程.被通知的線程獲得鎖后會(huì)進(jìn)入就緒隊(duì)列.

        3.3 信號(hào)量機(jī)制

        假設(shè)線程1需要同時(shí)擁有資源A和資源B才能工作,線程2需要同時(shí)擁有資源A和資源B才能工作,在進(jìn)行同步控制時(shí)有可能出現(xiàn)這種情況:線程1擁有資源A,線程2擁有資源B,兩個(gè)線程相互等待對(duì)方先釋放資源,并會(huì)一直這么僵持下去,這種情況稱為死鎖.

        為了避免死鎖,可以使用信號(hào)量機(jī)制:線程在嘗試申請(qǐng)某個(gè)資源前都要判斷能否一次性就獲得所有需要的資源,如果能,就申請(qǐng),如果不能,則不申請(qǐng),一直等到可以一次性獲得所有資源.

        4 多線程機(jī)制在socket編程中的應(yīng)用

        網(wǎng)絡(luò)編程,主要是指基于TCP的網(wǎng)絡(luò)通信編程,在Java中網(wǎng)絡(luò)編程是使用Socket類實(shí)現(xiàn),因此也稱為socket編程.socket編程模型中有服務(wù)器端和客戶端,服務(wù)器端使用ServerSocket創(chuàng)建,一般有固定的IP地址和端口號(hào),方便向外界提供服務(wù).客戶端可以有多個(gè),并且使用Socket主動(dòng)連接服務(wù)器.連接后,服務(wù)器端也創(chuàng)建一個(gè)Socket對(duì)象表示這次連接.

        4.1 socket編程的服務(wù)器端實(shí)現(xiàn)

        在Java中實(shí)現(xiàn)socket編程,服務(wù)器端要做的事情主要有:創(chuàng)建服務(wù)器對(duì)象ServerSocket;等待客戶端的連接請(qǐng)求,收到請(qǐng)求后即返回表示這次連接的Socket對(duì)象;開(kāi)啟新的線程專門(mén)處理這個(gè)連接;獲得連接的輸入輸出流,并按照一定的規(guī)則進(jìn)行數(shù)據(jù)交換;關(guān)閉連接(關(guān)閉連接時(shí)會(huì)自動(dòng)關(guān)閉IO流).服務(wù)器端socket編程的主要代碼如下:

        public class ServerTest{

        public static void main(String[]args){

        try{

        ServerSocket server=new ServerSocket(10002);

        while(true){

        Socket socket=server.accept();

        MyThread myThread=new MyThread(socket);

        myThread.start();

        }

        }catch(IOException e){

        e.printStackTrace();

        }

        }

        }

        4.2 socket編程的客戶端實(shí)現(xiàn)

        在Java中實(shí)現(xiàn)socket編程,客戶端要做的事情主要有:創(chuàng)建Socket對(duì)象,即向服務(wù)器申請(qǐng)連接;獲得連接的輸入輸出流,并按照一定的規(guī)則進(jìn)行數(shù)據(jù)交換;最后關(guān)閉連接(關(guān)閉連接時(shí)會(huì)自動(dòng)關(guān)閉IO流).客戶端socket編程的主要代碼如下:

        public class ClientTest{

        public static void main(String[]args)throws IOException{

        Socket socket=new Socket("localhost",10001);

        InputStream inputStream=socket.getInputStream();

        OutputStream outputStream=socket.getOutputStream();

        byte[]buff=new byte[1024];

        int len=inputStream.read(buff);

        System.out.println(new String(buff,0,len));

        socket.close();

        }

        }

        猜你喜歡
        服務(wù)器端線程進(jìn)程
        債券市場(chǎng)對(duì)外開(kāi)放的進(jìn)程與展望
        淺析異步通信層的架構(gòu)在ASP.NET 程序中的應(yīng)用
        成功(2018年10期)2018-03-26 02:56:14
        淺談linux多線程協(xié)作
        在Windows中安裝OpenVPN
        社會(huì)進(jìn)程中的新聞學(xué)探尋
        我國(guó)高等教育改革進(jìn)程與反思
        Linux僵死進(jìn)程的產(chǎn)生與避免
        Linux線程實(shí)現(xiàn)技術(shù)研究
        網(wǎng)頁(yè)防篡改中分布式文件同步復(fù)制系統(tǒng)
        么移動(dòng)中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
        亚洲第一网站免费视频| 国产一级淫片免费播放电影| av无码电影一区二区三区| 国产人妖直男在线视频| 国产精品一区区三区六区t区| 在线播放偷拍一区二区| 午夜一区二区视频在线观看| 曰本女人与公拘交酡| 色综合中文综合网| 亚洲AV无码未成人网站久久精品| 免费在线观看视频专区| 人妻少妇69久久中文字幕| 丁香美女社区| 久久久久久av无码免费看大片| 久久精品无码一区二区三区不卡| 蜜桃网站入口可看18禁| 成人爽a毛片免费视频| 一本大道东京热无码| 久久精品午夜免费看| 91熟女av一区二区在线| 亚洲日韩国产一区二区三区| 亚洲色偷偷色噜噜狠狠99| 国产三级黄色的在线观看 | 亚洲精品成人国产av| 亚洲国产免费公开在线视频| 亚洲一区亚洲二区视频在线| 久久久久久久97| 久热这里只有精品99国产| 国产美女高潮流的白浆久久| 变态调教一区二区三区女同| 特级婬片国产高清视频| 就国产av一区二区三区天堂| av免费在线国语对白| 免费无码av一区二区三区| 四虎影永久在线观看精品| 国产成人亚洲合色婷婷| 免费a级毛片高清在钱| 五月婷婷俺也去开心| 欧美国产伦久久久久久久| av男人的天堂亚洲综合网| 日本无码人妻波多野结衣|