線程 是一段完成某個(gè)特定功能的代碼,程序中的執(zhí)行線程。Java 虛擬機(jī)允許應(yīng)用程序并發(fā)地運(yùn)行多個(gè)執(zhí)行線程。
每個(gè)線程都有一個(gè)優(yōu)先級,高優(yōu)先級線程的執(zhí)行優(yōu)先于低優(yōu)先級線程。
 進(jìn)程不同的是,由同名類生成的多個(gè)線程共享相同的內(nèi)存空間和系統(tǒng)資源。
線程與進(jìn)程的區(qū)別: 一個(gè)線程是一個(gè)程序內(nèi)部的順序控制流。
 1.
進(jìn)程:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文)
,進(jìn)程切換的開銷大。線程:同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程切換的開銷小。
 2.
一個(gè)進(jìn)程中可以包含多個(gè)線程。
 本文將介紹以下線程方面的知識: 1,線程的創(chuàng)建
2,線程的狀態(tài)
 3,線程同步
 4,線程組
理解線程的最有效的方法是通過實(shí)例來理解。下面我們將通過 售貨員售書
為例,由淺入深地介紹線程的創(chuàng)建,通信,鎖機(jī)制等概念。
售貨員售書
我們
假設(shè)一下售貨員售書的操作流程:
1,我們假設(shè)有20本書,交給2個(gè)售貨員去賣。
2,售貨員可以賣掉任何一本尚未賣出去的書。換句話說,同
一本書若被其中一位售出去了,則不能被另外一位再售出了。清單1:
    
        
            | 文件名 | 說明 | 
        
            | Book.java | 書籍類 | 
        
            | SellBookRunnable.java | 售書類,線程的創(chuàng)建方法之一,該類實(shí)現(xiàn)了Runnable 接口,并實(shí)現(xiàn)了 run 方法。 | 
        
            | SellBookThread.java | 售書類,線程的創(chuàng)建方法之一,該類聲明為 Thread 的子類,并重寫 Thread 類的 run 方法。 | 
        
            | CallSellBook.java | 調(diào)用類。該類分別介紹了2種不同線程創(chuàng)建的調(diào)用方法。 | 
    

Book.java
    - public class Book {  
-     private String name;  
-     private boolean sold = false;  
-   
-     public Book(String name) {  
-         this.name = name;  
-     }  
-     public String getName() {  
-         return name;  
-     }  
-   
-     public void setName(String name) {  
-         this.name = name;  
-     }  
-   
-     public boolean isSold() {  
-         return sold;  
-     }  
-   
-     public void setSold(boolean sold) {  
-         this.sold = sold;  
-     }  
- }  
 
public class Book {
    private String name;
    private boolean sold = false;
    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isSold() {
        return sold;
    }
    public void setSold(boolean sold) {
        this.sold = sold;
    }
}
 

SellBookRunnable.java
    - import java.util.List;  
-   
- public class SellBookRunnable implements Runnable {  
-     private String saleMan;  
-     private List<Book> bookList;  
-   
-     public SellBookRunnable(String saleMan, List<Book> bookList) {  
-         this.saleMan = saleMan;  
-         this.bookList = bookList;  
-     }  
-   
-     public void run() {  
-         for (int i = 0; i < bookList.size(); i++) {  
-             Book book = bookList.get(i);  
-             sellBook(book);  
-         }  
-     }  
-   
-      
-  
-  
-  
-   
-     private void sellBook(Book book) {  
-           
-         synchronized (book) {  
-             if (book.isSold()) {  
-                 return;  
-             } else {  
-                 try {  
-                       
-                     Thread.sleep(500);  
-                 } catch (Exception e) {  
-                 }  
-                   
-                   
-                 book.setSold(true);  
-                   
-                 System.out.println("[" + saleMan + "]" + book.getName() + " sold out:"  
-                         + book.isSold() + ". by "  
-                         + Thread.currentThread().getName());  
-   
-             }  
-         }  
-     }  
- }  
 
import java.util.List;
public class SellBookRunnable implements Runnable {
    private String saleMan;
    private List<Book> bookList;
    public SellBookRunnable(String saleMan, List<Book> bookList) {
        this.saleMan = saleMan;
        this.bookList = bookList;
    }
    public void run() {
        for (int i = 0; i < bookList.size(); i++) {
            Book book = bookList.get(i);
            sellBook(book);
        }
    }
    /**
     * 售貨員賣書。我們這樣描述售貨員的賣書過程。
     *
     * @param book Book
     */
    private void sellBook(Book book) {
        //從開始售書-到售書完成,使用synchronized (book)保證book不被其他售貨員售出
        synchronized (book) {
            if (book.isSold()) {
                return;
            } else {
                try {
                    //為了讓各線程有執(zhí)行機(jī)會,設(shè)置平均售書時(shí)間為0.5秒
                    Thread.sleep(500);
                } catch (Exception e) {
                }
                
                //設(shè)置已售標(biāo)志
                book.setSold(true);
                //打印該書已售信息
                System.out.println("[" + saleMan + "]" + book.getName() + " sold out:"
                        + book.isSold() + ". by "
                        + Thread.currentThread().getName());
            }
        }
    }
}
 

SellBookThread.java
    - import java.util.List;  
-   
- public class SellBookThread extends Thread {  
-     private String saleMan;  
-     private List<Book> bookList;  
-   
-     public SellBookThread(String saleMan, List<Book> bookList) {  
-         this.saleMan = saleMan;  
-         this.bookList = bookList;  
-     }  
-   
-     public void run() {  
-         for (int i = 0; i < bookList.size(); i++) {  
-             Book book = bookList.get(i);  
-             sellBook(book);  
-         }  
-     }  
-   
-      
-  
-  
-  
-   
-     private void sellBook(Book book) {  
-           
-         synchronized (book) {  
-             if (book.isSold()) {  
-                 return;  
-             } else {  
-                 try {  
-                       
-                     Thread.sleep(500);  
-                 } catch (Exception e) {  
-                 }  
-                   
-                   
-                 book.setSold(true);  
-                   
-                 System.out.println("[" + saleMan + "]" + book.getName() + " sold out:"  
-                         + book.isSold() + ". by "  
-                         + Thread.currentThread().getName());  
-   
-             }  
-         }  
-     }  
- }  
 
import java.util.List;
public class SellBookThread extends Thread {
    private String saleMan;
    private List<Book> bookList;
    public SellBookThread(String saleMan, List<Book> bookList) {
        this.saleMan = saleMan;
        this.bookList = bookList;
    }
    public void run() {
        for (int i = 0; i < bookList.size(); i++) {
            Book book = bookList.get(i);
            sellBook(book);
        }
    }
    /**
     * 售貨員賣書。我們這樣描述售貨員的賣書過程。
     *
     * @param book Book
     */
    private void sellBook(Book book) {
        //從開始售書-到售書完成,使用synchronized (book)保證book不被其他售貨員售出
        synchronized (book) {
            if (book.isSold()) {
                return;
            } else {
                try {
                    //為了讓各線程有執(zhí)行機(jī)會,設(shè)置平均售書時(shí)間為0.5秒
                    Thread.sleep(500);
                } catch (Exception e) {
                }
                
                //設(shè)置已售標(biāo)志
                book.setSold(true);
                //打印該書已售信息
                System.out.println("[" + saleMan + "]" + book.getName() + " sold out:"
                        + book.isSold() + ". by "
                        + Thread.currentThread().getName());
            }
        }
    }
}
 

CallSellBook.java
    - import java.util.ArrayList;  
- import java.util.List;  
-   
-   
- public class CallSellBook {  
-   
-      
-  
-   
-     public static void main(String[] args) {  
-           
-         callSellBookThread();  
-   
-           
-           
-           
-           
-     }  
-       
-       
-     public static void callSellBookThread() {  
-         List <Book>bookList = getBookListForSale();  
-           
-           
-         Thread t1 = new SellBookThread("SaleMan1", bookList);  
-           
-         Thread t2 = new SellBookThread("SaleMan2", bookList);  
-   
-           
-         t1.start();  
-           
-         t2.start();  
-     }  
-       
-       
-       
-     public static void callSellBookRunnable() {  
-         List <Book>bookList = getBookListForSale();  
-           
-           
-         Thread t1 = new Thread(new SellBookRunnable("SaleMan1", bookList));  
-           
-         Thread t2 = new Thread(new SellBookRunnable("SaleMan2", bookList));  
-   
-           
-         t1.start();  
-           
-         t2.start();  
-     }  
-   
-       
-     public static List<Book> getBookListForSale() {  
-         List <Book>bookList = new ArrayList();  
-         for (int i = 0; i < 20; i++) {  
-             Book book = new Book("Book" + i);  
-             bookList.add(book);  
-         }  
-           
-         return bookList;  
-     }  
- }  
 
import java.util.ArrayList;
import java.util.List;
//該類調(diào)用SellBookXxx類
public class CallSellBook {
    /**
     * 用線程模擬這個(gè)售書的過程
     */
    public static void main(String[] args) {
        //方法1:
        callSellBookThread();
        //or
        
        //方法2:
        //callSellBookRunnable();
    }
    
    //調(diào)用SellBookRunnable(Runnable接口實(shí)現(xiàn)類)模擬售書過程
    public static void callSellBookThread() {
        List <Book>bookList = getBookListForSale();
        
        //將預(yù)售書籍清單交給售貨員SaleMan1
        Thread t1 = new SellBookThread("SaleMan1", bookList);
        //將預(yù)售書籍清單交給售貨員SaleMan2
        Thread t2 = new SellBookThread("SaleMan2", bookList);
        //售貨員SaleMan1開始售書
        t1.start();
        //售貨員SaleMan2開始售書
        t2.start();
    }
    
    
    //調(diào)用SellBookRunnable(Runnable接口實(shí)現(xiàn)類)模擬售書過程
    public static void callSellBookRunnable() {
        List <Book>bookList = getBookListForSale();
        
        //將預(yù)售書籍清單交給售貨員SaleMan1
        Thread t1 = new Thread(new SellBookRunnable("SaleMan1", bookList));
        //將預(yù)售書籍清單交給售貨員SaleMan2
        Thread t2 = new Thread(new SellBookRunnable("SaleMan2", bookList));
        //售貨員SaleMan1開始售書
        t1.start();
        //售貨員SaleMan2開始售書
        t2.start();
    }
    //準(zhǔn)備預(yù)售書籍
    public static List<Book> getBookListForSale() {
        List <Book>bookList = new ArrayList();
        for (int i = 0; i < 20; i++) {
            Book book = new Book("Book" + i);
            bookList.add(book);
        }
        
        return bookList;
    }
}
 
執(zhí)行CallSellBook
[SaleMan1]Book0
sold out:true. by Thread-0
[SaleMan2]Book1 sold out:true. by
Thread-1
[SaleMan2]Book2 sold out:true. by Thread-1
[SaleMan2]Book3
sold out:true. by Thread-1
[SaleMan2]Book4 sold out:true. by
Thread-1
[SaleMan2]Book5 sold out:true. by Thread-1
[SaleMan1]Book6
sold out:true. by Thread-0
[SaleMan1]Book7 sold out:true. by
Thread-0
[SaleMan1]Book8 sold out:true. by Thread-0
[SaleMan1]Book9
sold out:true. by Thread-0
[SaleMan1]Book10 sold out:true. by
Thread-0
[SaleMan1]Book11 sold out:true. by Thread-0
[SaleMan2]Book12
sold out:true. by Thread-1
[SaleMan2]Book13 sold out:true. by
Thread-1
[SaleMan2]Book14 sold out:true. by Thread-1
[SaleMan2]Book15
sold out:true. by Thread-1
[SaleMan2]Book16 sold out:true. by
Thread-1
[SaleMan2]Book17 sold out:true. by Thread-1
[SaleMan1]Book18
sold out:true. by Thread-0
[SaleMan1]Book19 sold out:true. by
Thread-0
下一頁:線程的創(chuàng)建方法,線程狀態(tài),線程同步等