Java-基礎程式設計-多執行緒
目錄
一:程式,程式,執行緒
二.使用多執行緒的優點
三:執行緒的建立和啟動
四. Thread類的有關方法
五.執行緒的生命週期
六.執行緒的同步
七.執行緒的通訊
八:經典的生產者消費者例題
執行緒通訊的應用:經典例題:生產者/消費者問題
生產者(Producer)將產品交給店員(Clerk),而消費者(Customer)從店員處取走產品,
店員一次只能持有固定數量的產品(比如20),如果生產者試圖生產更多的產品,店員會叫
生產者停一下,如果店中有空位放產品了再通知生產者繼續生產;如果店中沒有產品了,店
員會告訴消費者等一下,如果店中有產品了再通知消費者來取走產品
分析:
1)是否是多執行緒問題? 是,生產者執行緒,消費者執行緒
2)是否有共享資料? 是, 店員(或者產品)
3)如何解決執行緒的安全問題? 同步機制,有三種方法
4)是否涉及執行緒的通訊? 是
程式碼解決:
class Clerk{
private int productCount = 0;
// 生產產品
public synchronized void produceProduct() {
if(productCount < 20) {
productCount++;
System.out.println(Thread.currentThread().getName() + ":開始生產第" + productCount);
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 消費產品
public synchronized void consumeProduct() {
if(productCount > 0) {
System.out.println(Thread.currentThread().getName() + ":開始消費第"+ productCount);
productCount--;
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Producer extends Thread{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName()+":開始生產產品......");
while(true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.produceProduct();
}
}
}
class Consumer extends Thread{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName()+":開始消費產品......");
while(true) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.consumeProduct();
}
}
}
public class ProductTest {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer p1 = new Producer(clerk);
p1.setName("生產者1");
Consumer c1 = new Consumer(clerk);
c1.setName("消費者1");
Consumer c2 = new Consumer(clerk);
c1.setName("消費者2");
p1.start();
c1.start();
c2.start();
}
}
相關文章
- Java多執行緒程式設計基礎Java執行緒程式設計
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒程式設計基礎知識執行緒程式設計
- java多執行緒程式設計--基礎篇Java執行緒程式設計
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- Java-基礎-執行緒入門Java執行緒
- 網路程式設計基礎,多執行緒下載程式設計執行緒
- 網路程式設計基礎-socket加入多執行緒程式設計執行緒
- 多執行緒程式設計的基礎知識點執行緒程式設計
- java執行緒程式設計(一):執行緒基礎(轉)Java執行緒程式設計
- Linux 環境多執行緒程式設計基礎設施Linux執行緒程式設計
- Linux環境多執行緒程式設計基礎設施Linux執行緒程式設計
- Java多執行緒程式設計基礎知識彙總Java執行緒程式設計
- Java基礎之多執行緒程式設計Java執行緒程式設計
- 多執行緒系列(1),多執行緒基礎執行緒
- 多執行緒系列(二):多執行緒基礎執行緒
- Java 多執行緒設計模式之基礎概念Java執行緒設計模式
- 多執行緒基礎執行緒
- 多執行緒程式設計執行緒程式設計
- 併發程式設計之多執行緒基礎程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- 多執行緒學習一(多執行緒基礎)執行緒
- 程式執行緒篇——程式執行緒基礎執行緒
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Boost多執行緒程式設計執行緒程式設計
- UNIX多執行緒程式設計執行緒程式設計
- 多執行緒程式設計(轉)執行緒程式設計
- java - 多執行緒基礎Java執行緒
- Java—多執行緒基礎Java執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 多執行緒系列(三):執行緒池基礎執行緒
- 多執行緒基礎-基礎實現執行緒
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計
- 執行緒和程式基礎以及多執行緒的基本使用(iOS)執行緒iOS
- JAVA SE 實戰篇 C1 多執行緒程式設計基礎Java執行緒程式設計
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計