java多線程編程注意問題

來源:互聯網
上載者:User
java多線程編程注意問題

多線程的概念問度娘 ,大部分是千篇一律的。對於編程經驗不是很豐富的程式員是比較難消化的。
作者從實際應用的角度來分析java多線程編程應注意的問題。
應用情境假設:
一個影院有三個售票口,
分別用於向兒童、成人和老人售票。影院為每個視窗放有100張電影票,
分別是兒童票、成人票和老人票。(一個售票員相當於一個CPU,電影院最多可提供3名售票員).
問題:怎樣使電影院售票速度最快。(很多人在排隊等待買票)。
那麼可想而知,我們是開3個售票視窗,讓3名售票員都動起來。這就是多線程。

在java平台多線程編程的程式員都知道,線程編程有2種實現辦法繼承Thread 和實現Runnable介面。
我們先來看用繼承的辦法實現。
public class MutliThread  extends Thread{
    private int ticket=100;//每個線程都擁有100張票
    public void run(){
        while(ticket>0){
            
            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
測試類別
public class MutliThreadDemo {
    public static void main(String [] args){
        MutliThread m1=new MutliThread("Window 1");
        MutliThread m2=new MutliThread("Window 2");
        MutliThread m3=new MutliThread("Window 3");
        m1.start();
        m2.start();
        m3.start();
    }
    }

問題2 。如果影院的票總計是100張,3名售票員同事售票。上述繼承的辦法是否能滿足要求。
經過分析明顯不能滿足,因為無法實現多線程資源共用。這個時候我們就需要採用實現Runnable介面的辦法。

public class MutliThread  implements Runnable{
    private int ticket=100;//每個線程都擁有100張票
    public void run(){
        while(ticket>0){
            
            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

測試類別:

public class MutliThreadDemo {
    public static void main(String [] args){
        MutliThread m=new MutliThread();
        Thread t1=new Thread(m,"Window "+i);
    Thread t2=new Thread(m,"Window "+i);
    Thread t3=new Thread(m,"Window "+i);
    t1.start();
    t2.start();
    t3.start();
    }
    }


對於第2中多線程,我們的線程是不是安全,是執行了100次。答案是肯定的。
作者將列印的語句進行了比對。確實是100次。
如果將變數換成靜態,就是大於100次。是不滿足我們的業務需求。

其實寫個多線程類並不難,難的是要分析我們的線程是不是安全的。這個安全就是滿足我們的業務需求。

那在多線程編程的時候,我們要注意什麼問題了。
總結:
1.多線程共用資源,執行同一任務,需要Runnable介面。
2 靜態方法通常是安全的。靜態成員變數是不安全的。
3.如何解決我們的安全問題,通常的做法是鎖機制,或者用普通成員變數。

4.舉例:HashMap  與 currentHashMap . 區別: hashmap 比currenthashmap執行效率要高。但線程不安全。 而currenthashmap線程是安全的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.