多執行緒 生產者消費者佇列

2021-07-02 02:07:57 字數 2306 閱讀 3727

就以alibaba的筆試題舉例吧。

題目大概的意思如下:

有乙個籃子,最多容納5個蘋果。有人一直往裡放蘋果。有人一直去蘋果。寫出實現。

ali要求不能用concurrent包裡面的東西,所以只能用最簡單的notify和wait。

如果可以用concurrent包裡面的東西,還可以用blockingqueue和signal、await。

下面實現三種方式:

method1.  notigyall()/notify()/wait

public class basket  catch (exception e) 

} this.size++;

system.out.println(">> 當前籃子內蘋果數"+size);

notifyall(); }

if(size<=0) catch (exception e)

} this.size--;

system.out.println("<< 當前籃子內蘋果數"+size);

notifyall(); }

public synchronized int getsize()

}

public class get implements runnable

public void run() }

}

public class put implements runnable 

public void run(

// todo auto-generated method stub

while(!thread.interrupted())

}}

public class test 

}

注意,我在測試類裡面用了concurrent的executor,測試類無所謂了。

mtthod2>blockingqueue

public class basket 

try catch (interruptedexception e) }

//從籃子取出

system.out.println("<< 當前籃子數量 "+list.size());

if(list.size()<=0)

try catch (interruptedexception e)

}}

public class get implements runnable 

public void run()

}}

public class put implements runnable 

public void run()

}}

public class test 

}

使用blockingqueue的時候,注意一下api就好了。注意 是 put 和 take 函式。

method3.signal、await

public class basket 

this.size++;

condition.signalall();

} catch (exception e) finally

}lock.lock();

try

this.size--;

condition.signalall();

} catch (exception e) finally

} public synchronized int getsize()

}

public class get implements runnable

public void run() }

}

public class put implements runnable 

public void run()

}}

public class test 

}

根據demo可以明顯看出:signal、await是與lock配合用的。而wait、notify是與synchonized配合用的。因此前者擁有更好的靈活性。

多執行緒 生產者消費者

這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...

Linux多執行緒 生產者消費者

生產者消費者問題 這是乙個非常經典的多執行緒題目,題目大意如下 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步...

多執行緒 生產者和消費者

生產者 消費者問題 生產者向產品區里放產品,當產品區里滿了,需要等待 消費者從產品區里取產品消耗,當產品區里空了,需要等待。public class producerandconsumer 消費者 static class consumer implements runnable catch int...