小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

范例解說Java里的線程概念與線程同步技術(shù) - JAVA專欄

 汲取者 2010-05-06

本文以通俗易懂的范例入手,由淺入深的全面介紹了Java里的線程概念與線程同步技術(shù)。

Page:  <1|2>

線程 是一段完成某個(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
  1. public class Book {  
  2.     private String name;  
  3.     private boolean sold = false;  
  4.   
  5.     public Book(String name) {  
  6.         this.name = name;  
  7.     }  
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.   
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.   
  16.     public boolean isSold() {  
  17.         return sold;  
  18.     }  
  19.   
  20.     public void setSold(boolean sold) {  
  21.         this.sold = sold;  
  22.     }  
  23. }  



SellBookRunnable.java

  1. import java.util.List;  
  2.   
  3. public class SellBookRunnable implements Runnable {  
  4.     private String saleMan;  
  5.     private List<Book> bookList;  
  6.   
  7.     public SellBookRunnable(String saleMan, List<Book> bookList) {  
  8.         this.saleMan = saleMan;  
  9.         this.bookList = bookList;  
  10.     }  
  11.   
  12.     public void run() {  
  13.         for (int i = 0; i < bookList.size(); i++) {  
  14.             Book book = bookList.get(i);  
  15.             sellBook(book);  
  16.         }  
  17.     }  
  18.   
  19.     /** 
  20.      * 售貨員賣書。我們這樣描述售貨員的賣書過程。 
  21.      *  
  22.      * @param book Book 
  23.      */  
  24.     private void sellBook(Book book) {  
  25.         //從開始售書-到售書完成,使用 synchronized (book)保證book不被其他售貨員售出  
  26.         synchronized (book) {  
  27.             if (book.isSold()) {  
  28.                 return;  
  29.             } else {  
  30.                 try {  
  31.                     //為了讓各線程有執(zhí)行 機(jī)會,設(shè)置平均售書時(shí)間為0.5秒  
  32.                     Thread.sleep(500);  
  33.                 } catch (Exception e) {  
  34.                 }  
  35.                   
  36.                 //設(shè)置已售標(biāo)志  
  37.                 book.setSold(true);  
  38.                 //打印該書已售信息  
  39.                 System.out.println("[" + saleMan + "]" + book.getName() + " sold out:"  
  40.                         + book.isSold() + ". by "  
  41.                         + Thread.currentThread().getName());  
  42.   
  43.             }  
  44.         }  
  45.     }  
  46. }  



SellBookThread.java

  1. import java.util.List;  
  2.   
  3. public class SellBookThread extends Thread {  
  4.     private String saleMan;  
  5.     private List<Book> bookList;  
  6.   
  7.     public SellBookThread(String saleMan, List<Book> bookList) {  
  8.         this.saleMan = saleMan;  
  9.         this.bookList = bookList;  
  10.     }  
  11.   
  12.     public void run() {  
  13.         for (int i = 0; i < bookList.size(); i++) {  
  14.             Book book = bookList.get(i);  
  15.             sellBook(book);  
  16.         }  
  17.     }  
  18.   
  19.     /** 
  20.      * 售貨員賣書。我們這樣描述售貨員的賣書過程。 
  21.      *  
  22.      * @param book Book 
  23.      */  
  24.     private void sellBook(Book book) {  
  25.         //從開始售書-到售書完成,使用 synchronized (book)保證book不被其他售貨員售出  
  26.         synchronized (book) {  
  27.             if (book.isSold()) {  
  28.                 return;  
  29.             } else {  
  30.                 try {  
  31.                     //為了讓各線程有執(zhí)行 機(jī)會,設(shè)置平均售書時(shí)間為0.5秒  
  32.                     Thread.sleep(500);  
  33.                 } catch (Exception e) {  
  34.                 }  
  35.                   
  36.                 //設(shè)置已售標(biāo)志  
  37.                 book.setSold(true);  
  38.                 //打印該書已售信息  
  39.                 System.out.println("[" + saleMan + "]" + book.getName() + " sold out:"  
  40.                         + book.isSold() + ". by "  
  41.                         + Thread.currentThread().getName());  
  42.   
  43.             }  
  44.         }  
  45.     }  
  46. }  



CallSellBook.java

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. //該類調(diào)用SellBookXxx類  
  5. public class CallSellBook {  
  6.   
  7.     /** 
  8.      * 用線程模擬這個(gè)售書的過程 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         //方法1:  
  12.         callSellBookThread();  
  13.   
  14.         //or  
  15.           
  16.         //方法2:  
  17.         //callSellBookRunnable();  
  18.     }  
  19.       
  20.     //調(diào)用SellBookRunnable(Runnable接 口實(shí)現(xiàn)類)模擬售書過程  
  21.     public static void callSellBookThread() {  
  22.         List <Book>bookList = getBookListForSale();  
  23.           
  24.         //將預(yù)售書籍清單交給售貨員SaleMan1  
  25.         Thread t1 = new SellBookThread("SaleMan1", bookList);  
  26.         //將預(yù)售書籍清單交給售貨員SaleMan2  
  27.         Thread t2 = new SellBookThread("SaleMan2", bookList);  
  28.   
  29.         //售貨員SaleMan1開始售書  
  30.         t1.start();  
  31.         //售貨員SaleMan2開始售書  
  32.         t2.start();  
  33.     }  
  34.       
  35.       
  36.     //調(diào)用SellBookRunnable(Runnable接 口實(shí)現(xiàn)類)模擬售書過程  
  37.     public static void callSellBookRunnable() {  
  38.         List <Book>bookList = getBookListForSale();  
  39.           
  40.         //將預(yù)售書籍清單交給售貨員SaleMan1  
  41.         Thread t1 = new Thread(new SellBookRunnable("SaleMan1", bookList));  
  42.         //將預(yù)售書籍清單交給售貨員SaleMan2  
  43.         Thread t2 = new Thread(new SellBookRunnable("SaleMan2", bookList));  
  44.   
  45.         //售貨員SaleMan1開始售書  
  46.         t1.start();  
  47.         //售貨員SaleMan2開始售書  
  48.         t2.start();  
  49.     }  
  50.   
  51.     //準(zhǔn)備預(yù)售書籍  
  52.     public static List<Book> getBookListForSale() {  
  53.         List <Book>bookList = new ArrayList();  
  54.         for (int i = 0; i < 20; i++) {  
  55.             Book book = new Book("Book" + i);  
  56.             bookList.add(book);  
  57.         }  
  58.           
  59.         return bookList;  
  60.     }  
  61. }  


執(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),線程同步等

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多