(一)學習總結
1.用思維導圖對java多線程的學習內容進行總結。
2.下面是一個單線程實現的龜兔賽跑游戲。
public class TortoiseHareRace {
public static void main(String[] args) {
int totalStep = 10;
int tortoiseStep = 0;
int hareStep = 0;
boolean[] flags = {true,false};
System.out.println("龜兔賽跑開始了...");
while(tortoiseStep < totalStep && hareStep < totalStep){
tortoiseStep++;
System.out.println("烏龜跑了"+tortoiseStep+"步...");
boolean isHareSleep = flags[((int)(Math.random()*10))%2];
if(isHareSleep){
System.out.println("兔子睡着了zzzz");
}else{
hareStep += 2;
System.out.println("兔子跑了"+hareStep+"步...");
}
}
}
}
閱讀程序,采用實現Runnable接口的方式用多線程實現這個小游戲。下面給出主線程類,補充Tortoise線程類和Hare線程類。
public class TortoiseHareRace {
public static void main(String[] args) {
Tortoise tortoise = new Tortoise(10);
Hare hare = new Hare(10);
Thread tortoiseThread = new Thread(tortoise);
Thread hareThread = new Thread(hare);
tortoiseThread.start();
hareThread.start();
}
}
3.下面的程序是模擬了生產者——消費者問題,生產者生產10個數,消費者依次消費10個數,運行程序,看結果是否正常?存在什么問題?說明原因。使用synchronized, wait, notify
解決程序出現的問題。寫出修改的部分程序即可。
class Consumer implements Runnable {
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
System.out.println("消費者開始消耗整數......");
// 消耗10個整數
for(int i = 1; i <= 10; i++) {
try {
// 等待隨機時間
Thread.sleep((int) (Math.random() * 3000));
}
catch(InterruptedException e) {
e.printStackTrace();
}
clerk.getProduct();// 從店員處取走整數
}
}
}
class Producer implements Runnable {
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
System.out.println( "生產者開始生產整數......");
// 生產1到10的整數
for(int product = 1; product <= 10; product++) {
try {
Thread.sleep((int) Math.random() * 3000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
clerk.setProduct(product); // 將產品交給店員
}
}
}
public class ProductTest {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Thread consumerThread = new Thread(new Consumer(clerk));
Thread producerThread = new Thread(new Producer(clerk));
consumerThread.start();
producerThread.start();
}
}
class Clerk {
private int product = -1; // -1 表示目前沒有產品
// 這個方法由生產者呼叫
public void setProduct(int product) {
this.product = product;
System.out.printf("生產者設定 (%d)%n", this.product);
}
// 這個方法由消費者呼叫
public int getProduct() {
int p = this.product;
System.out.printf("消費者取走 (%d)%n", this.product);
return p;
}
}
修改的代碼為:
class Clerk {
private int product = -1; // -1 表示目前沒有產品
private boolean flag=true;
// 這個方法由生產者呼叫
public void setProduct(int product) {
synchronized (this){
while(this.flag == false){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.product = product;
System.out.printf("生產者設定 (%d)%n", this.product);
this.flag = false;
notify();
}
}
// 這個方法由消費者呼叫
public int getProduct() {
synchronized (this){
while(this.flag == true){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.flag = true;
notify();
int p = this.product;
System.out.printf("消費者取走 (%d)%n", this.product);
return p;
}
}
}
(二)實驗總結
實驗內容:
1.模擬三個老師同時分發80分作業,每個老師相當於一個線程。
2.模擬一個銀行存款的程序。假設有兩個儲戶都去銀行往同一個賬戶進行存款,一次存100,每人存三次。要求儲戶每存一次錢,賬戶余額增加100,並在控制台輸出當前賬戶的余額。