Java多線程的相關機制

一 線程的基本概念java

線程是一個程序內部的順序控制流.一個進程至關於一個任務,一個線程至關於一個任務中的一條執行路徑.;多進程:在操做系統中能同時運行多個任務(程序);多線程:在同一個應用程序中有多個順序流同時執行;Java的線程是經過java.lang.Thread類來實現的;JVM啓動時會有一個由主方法(public static void main(){})所定義的線程;能夠經過建立Thread的實例來建立新的線程;每一個線程都是經過某個特定Thread對象所對應的方法run()來完成其操做的,方法run()稱爲線程體,經過調用Thread類的start()方法來啓動一個線程。多線程

二 線程的建立和啓動dom

能夠有兩種方式建立新的線程:
第一種:
1.定義線程類實現Runnable接口
2.Thread myThread = new Thread(target);   //target爲Runnable接口類型
3.Runnable中只有一個方法:public void run();用以定義線程運行體
4.使用Runnable接口能夠爲多個線程提供共享的數據
5.在實現Runnable接口的類的run()方法定義中能夠使用Thread的靜態方法public static Thread currentThread();獲取當前線程的引用

第二種:
1.能夠定義一個Thread的子類並重寫其run方法如:ide

class MyThread extends Thread {    
public void run() {...}

}


2.而後生成該類的對象:
MyThread myThread = new MyThread();this

三 線程控制的基本方法操作系統

isAlive():判斷線程是否還"活"着
getPriority():得到線程的優先級數值
setPriority():設置線程的優先級數值
Thread.sleep():將當前線程睡眠指定毫秒數
join():調用某線程的該方法,將當前線程與該線程"合併",即等待該線程結束,再恢復當前線程的運行
yield():讓出cpu,當前線程進入就緒隊列等待調度
wait():當前線程進入對象的wait pool
notify()/notifyAll():喚醒對象的wait pool中的一個/全部等待線程線程

四 線程同步code

實現生產者消費者問題來講明線程問題,舉例以下所示:
對象

/**   
* 生產者消費者問題   
*/  
package com.basic.thread;   

/**   
* @author johnston678   
*   
* @version 2009-05-06   
*/  
public class ProducerConsumer {   

     /**   
      * @param args   
      */  
     public static void main(String[] args) {           
         ProductBox pb = new ProductBox();   
         Producer p = new Producer(pb);   
         Consumer c = new Consumer(pb);   
           
         Thread pThread = new Thread(p);   
         Thread cThread = new Thread(c);   
         pThread.setPriority(Thread.MAX_PRIORITY);   
           
         pThread.start();   
         cThread.start();   
     }   

}   

/**   
* 產品對象   
* @author johsnton678   
*/  
class Product {   
     int id;   

     public Product(int id) {   
         super();   
         this.id = id;   
     }   
       
     public String toString(){   
         return "Product:" + id;   
     }   
}   

/**   
* 產品盒對象   
* @author johnston678   
*/  
class ProductBox {   

     Product[] productbox = new Product[6];   
     int index = 0;   
     public ProductBox() {   
         super();           
     }   
       
     public synchronized void push(Product p) {   
         while (index == productbox.length) {   
             try {   
                 this.wait();   
             } catch (InterruptedException e) {   
                 // TODO Auto-generated catch block   
                 e.printStackTrace();   
             }   
         }   
         this.notify();           
         productbox[index] = p;   
         index ++;   
     }   
       
     public synchronized Product pop() {   
         while (index == 0) {   
             try {   
                 this.wait();   
             } catch (InterruptedException e) {   
                 // TODO Auto-generated catch block   
                 e.printStackTrace();   
             }   
         }   
         this.notify();   
         index --;   
         return productbox[index];   
           
     }   
}   

/**   
* 生產者   
* @author johnston678   
*/  
class Producer implements Runnable {   

     ProductBox productbox = null;   
       
     public Producer(ProductBox productbox) {   
         super();   
         this.productbox = productbox;   
     }   

     @Override  
     public void run() {   
         // TODO Auto-generated method stub   
         for (int i=0; i<10; i++) {   
             Product p = new Product(i);   
             productbox.push(p);   
             System.out.println("produce:" + p);   
               
             try {   
                 Thread.sleep((int)(Math.random() * 200));   
             } catch (InterruptedException e) {   
                 e.printStackTrace();   
             }   
         }   
     }   
       
}   

/**   
* 消費者   
* @author johnston678   
*/  
class Consumer implements Runnable {   

     ProductBox productbox = null;   
       
     public Consumer(ProductBox productbox) {   
         super();   
         this.productbox = productbox;   
     }   

     @Override  
     public void run() {   
         // TODO Auto-generated method stub   
         for (int i=0; i<10; i++) {   
             Product p = productbox.pop();   
             System.out.println("consume:" + p);   
               
             try {   
                 Thread.sleep((int)(Math.random() * 1000));   
             } catch (InterruptedException e) {   
                 e.printStackTrace();   
             }   
         }   
     }   
       
}
相關文章
相關標籤/搜索