淺談Java多線程

jopen 8年前發布 | 14K 次閱讀 Java開發

Java中多線程涉及下面4點

  1. 創建單線程:繼承Tread類 和 實現Rannable接口;
  2. 多線程使用:手動實例化多個線程 或者 使用線程池 ExecutorService;
  3. 多線程共享數據同步:可以采用同步synchronized執行run方法中的操作;
  4. 合理使用多線程同步數據,防止死鎖問題。
  5. </ol>


    1.創建線程

    1. 繼承Tread類
      public class MyThread extends Thread {
      
          public void run() {
              System.out.println(Thread.currentThread().getName());
          }
      
          public static void main(String[] args) {
              //不能共享數據
              //MyThread myThread = new MyThread(); 
              //能共享數據
              Thread myThread = new Thread(new MyThread());
              myThread.start(); 
          }
      }
    2. 實現Rannable接口

      public class MyThread implements Runnable {
      
          public void run() {
              System.out.println(Thread.currentThread().getName());
          }
      
          public static void main(String[] args) {
              //能共享數據
              Thread  myThread = new Thread(new MyThread());   
              myThread.start();
          }
      }
      上面寫了兩種創建線程的例子,注意:注釋內容。

    2.多線程使用

    1. 手動實例化自定義的線程類
      public class MyThread implements Runnable {
      
          public void run() {
              System.out.println(Thread.currentThread().getName());
          }
      
          public static void main(String[] args) {
              MyThread myThread  = new MyThread();
              new Thread(myThread).start();
              new Thread(myThread).start();
              new Thread(myThread).start();
          }
      }
    2. 使用線程池 ExecutorService

      public class MyThread implements Runnable {
      
          public void run() {
              System.out.println(Thread.currentThread().getName());
          }
      
          public static void main(String[] args) {
              ExecutorService pool = Executors.newCachedThreadPool();
              MyThread myThread = new MyThread();
              for(int i = 0; i < 3; i++){
                  pool.execute(myThread);
              }
              //關閉線程池
              pool.shutdown();
          }
      }

    3.多線程共享數據同步

    一個簡單賣票代碼:3個賣票員,共賣100張門票,買一張票耗時100毫秒。
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class MyThread implements Runnable {
    
        private int tickets = 100;
    
        private synchronized void sale() {
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName() + " 剩余:"
                        + (--tickets) + "張票");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else{
                Thread.currentThread().stop();
            }
        }
    
        public void run() {
            while(true){
                sale();         
            }
        }
    
        public static void main(String[] args) {
            ExecutorService pool = Executors.newCachedThreadPool();
            MyThread myThread = new MyThread();
            for (int i = 0; i < 3; i++) {
                pool.execute(myThread);
            }
            pool.shutdown();
        }
    
    }




    4.死鎖

    當線程之間互相等待共享資源時,會產生死鎖問題。我們可以在多線程的程序中減少同步關鍵字的使用,減少每一次占用資源的時間之類的措施來降低死鎖出現的可能性。




    來自: http://my.oschina.net/chenhao901007/blog/476377

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!