簡單的素數程式 初學者 希望碼齡高的大佬可以一下
阿新 • • 發佈:2020-12-25
技術標籤:筆記
進一步理解併發協作的管程法
package Thread;
public class cooperation {
public static void main(String[] args) {
SynContainer container = new SynContainer();
//生產者將資料存進容器,消費者從容其中取資料
//容器的容量代表著生產者或消費者一次性可以最多生產或消費幾個資料
//為執行緒新增同步,使得消費者生產者同時進行
//待容器沒有空間,生產者無法繼續生產,執行緒等待,等待消費者消費容器裡的資料,生產者繼續生產
//待消費者將全部資料消費後,無資料可消費,執行緒等待,等待生產者重新生產資料,執行緒s開啟,重新消費
new Consumer(container).start();
}
}
//生產者
class Productor extends Thread{
SynContainer container;
public Productor(SynContainer container) {
this.container = container;
}
public void run() { //開始生產 for(int i = 0;i<100;i++) { System.out.println("生產->"+i+"資料"); container.push(new data(i)); } }
}
//消費者
class Consumer extends Thread{
SynContainer container;
public Consumer(SynContainer container) {
this.container = container;
}
public void run() {
//開始消費
for(int i = 0;i<100;i++) {
System.out.println(“消費->”+container.pop().id+“資料”);
}
}
}
//快取區
class SynContainer{
data[] da = new data[1];//儲存資料的容器
//儲存 生產
public synchronized void push(data d) {
// 何時能生產 容器產生空間
// 不能生產 只有等待
if(count == da.length) {
try {
this.wait();//執行緒阻塞 消費者通知生產解除
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 存在空間 可以生產
da[count] = d;
count++;
this.notifyAll();
//存在資料 可以通知消費
}
//獲取 消費
public synchronized data pop() {
//何時消費容器中是否存在資料
// 沒有資料只能等待
if(count == 0) {
try {
this.wait();//執行緒阻塞,生產者通知消費
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//存在資料可以消費
count–;
data d = da[count];
this.notifyAll();//存在空間了可以喚醒對方
return d;
}
}
//資料
class data{
int id;
public data(int id) {
this.id = id;
}
}