多线程问题,生产者和消费者问题BUFFER里面只有一个位置,而多个生产者同时都看到这个位置,如何处理这个临界状态,而不出错呢,不用同步的方法。谢谢。
解决方案 »
- 版面无新贴,大家来谈谈Netbeans、Eclipse及MyEclipse ^_^
- 请教!如何形成邮件,急,在线等!
- 关于Generics的一道题目
- 如何使XML文件的encoding="utf-8"
- 使用Ant 怎么在编译的时候调用 lib 目录下的.jar包?
- 利用javax.xml.transform.*;transform xml时候的xsl:output@encoding问题
- 谁有JAVA的API啊?
- 为什么java1.43中没有javac的命令,而是javaw
- 一个关于Html的简单问题!
- 有关TOMCAT,RESIN,JRUN
- 请教大家关于jdbc的问题
- 求javase1.6api
生产者伪代码:
public class Productor{
public Product push(Product p){
while(true){
try{
buffer.add(p);
}catch(由于buffer.add不能添加进去而抛出的异常){
try{
Thread.sleep(Math.random()*1000);
}catch(Exception e){
}
}
}
//return XXX;
}
}
lz既然做这道题应该学了操作系统课了吧。
1.5以上版本如果要实现复杂操作,
可以单独写一个类,继承Thread或实现Runnable接口,
把BUFFER作为参数传进去。
则生成的线程共享一个 BUFFER 对象,用信号量控制,一个时间只有一个线程可以push()。import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;public class TestSemaphore {
public TestSemaphore(String name) {
} public static void main(String[] args) {
final BUFFER buffer = new BUFFER();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable(){ public void run() {
buffer.push(new Object());
}
}).start();
}
}
}class BUFFER
{
private List buffer = new ArrayList();
private Semaphore semaphore = new Semaphore(1);//Semaphore对象,并规定Semaphore可以发出的许可是1个
public void push(Object o)
{
try {
semaphore.acquire();//同时只能有1个线程能得到许可并向下执行,剩下的线程执行到这里会阻塞直到有新的许可。
System.out.println(o + " acquire.");
buffer.add(o);
Thread.sleep(5000);
buffer.remove(o);
//可添加复杂处理
semaphore.release();//执行完后线程释放掉许可,让在acquire()处阻塞的线程可以得到许可向下执行。
System.out.println(o + " release.");
} catch (Exception e) {
e.printStackTrace();
}
}
}