熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java多線程順序執行

2013-11-23 19:48:14  來源: Java高級技術 
    可惡的Java多線程一直沒搞懂同步的作用!
   
    一直以為同步的時候只要鎖住對象就能順序執行了
   
    public class Test {
   
    final static byte[] b = new byte[];
   
    public static void main(String[] args) {
   
    Test t = new Test()
   
    tthreadstart()
   
    Test t = new Test()
   
    tthreadstart()
   
    }
   
    Thread thread = new Thread(new Runnable() {
   
    @Override
   
    public void run() {
   
    test()
   
    }
   
    })
   
    public void test() {
   
    synchronized (this) {
   
    for (int n = ; n < ; n++) {
   
    Systemoutprintln(threadgetName() + : + n)
   
    try {
   
    Threadsleep(
   
    } catch (InterruptedException e) {
   
    eprintStackTrace()
   
    }
   
    }
   
    }
   
    }
   
    }
   
    但是這樣是錯誤的!兩個線程還是交替執行!
   
    查閱了很多資料才知道上面這個鎖是不正確的兩個線程鎖住的this對象不是同一個所以導致交叉執行應該修改為
   
    public class Test {
   
    final static byte[] b = new byte[];
   
    public static void main(String[] args) {
   
    Test t = new Test()
   
    tthreadstart()
   
    ttest()
   
    }
   
    Thread thread = new Thread(new Runnable() {
   
    @Override
   
    public void run() {
   
    test()
   
    }
   
    })
   
    public void test() {
   
    synchronized (this) {
   
    for (int n = ; n < ; n++) {
   
    Systemoutprintln(threadgetName() + : + n)
   
    try {
   
    Threadsleep(
   
    } catch (InterruptedException e) {
   
    eprintStackTrace()
   
    }
   
    }
   
    }
   
    }
   
    }
   
    這樣的確就是順序執行了因為函數鎖住的this對象是同一個如果去除線程同步當然就會交叉執行啦
   
    但是我還有點不明白的是第一個例子錯誤的原因是其鎖住的對象不是同一個但是如果我把this改為一個全局靜態常量還是不正確!理論上全局靜態常量整個運行周期內存中只會有一個對象阿!不明白為什麼還是不行!希望有高手可以解答
   
    其實我們用到同步多半是為了讓線程順序執行比如在做Android開發的時候我們通常希望前台顯示一個進度框後台線程去執行下載動作下載完之後前台線程在執行余下操作如界面顯示
   
    這個時候其實可以使用線程的join()!
   
    oin方法大家可以查下api它的意思是等待當前線程執行完後執行完畢才執行其他線程也就是說如果一個類中有這樣一個代碼段
   
    threadstart()
   
    threadstart()
   
    threadjoin()
   
    threadjoin()
   
    do something ;
   
    do something ;
   
    那麼這段代碼會等待兩個線程執行完畢後再執行 do something 和 do something 注意必須先啟動所有線程再join如果啟動一個就join一個結果是什麼?對那就會是等待thread執行完再執行thread再執行後續代碼
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27467.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.