关于这个线程的面试题你有自己的解答方案吗? 本帖最后由 java2000_net 于 2008-08-05 15:36:24 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我估计在wait中的线程,notify未必能叫的醒…… 是不是因为只有主线程一个线程在执行当执行if(list.size() <=0)wait();的时候就停住不往下走了自然就不会触发notify()方法了。 显然死锁了执行pop后都把list锁住了,后边的push就在synchronized (list)一句堵住了 用list做信号量肯定是错的 我用一个Object作为信号量,但是结果有时候会出错import java.util.LinkedList;public class TestStack2 { Object mutex ; LinkedList<Object> list ; public TestStack2() { } public TestStack2(LinkedList<Object> list ,Object mutex) { this.list = list; this.mutex = mutex; } public void push(Object x) { synchronized (mutex) { list.addLast(x); mutex.notifyAll(); } } public Object pop() throws Exception { synchronized (mutex) { if(list.size() <=0) mutex.wait(); return list.removeLast(); } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO 自动生成方法存根 LinkedList<Object> list = new LinkedList<Object>(); Object mutex = new Object(); for(int i = 0;i < 3; i++) new TDeleteObject(list,mutex).start(); for(int i = 0;i < 3; i++) new TAddObject(list,mutex).start(); }}class TAddObject extends Thread{ TestStack2 test ; public TAddObject(LinkedList<Object> list,Object mutex) { test = new TestStack2(list,mutex); } public void run(){ test.push(Thread.currentThread().getName()); }}class TDeleteObject extends Thread { TestStack2 test ; public TDeleteObject(LinkedList<Object> list,Object mutex) { test = new TestStack2(list,mutex); } public void run(){ try { String str = test.pop().toString(); System.out.println(str); } catch (Exception e) { e.printStackTrace(); } }}结果为什么有时候是错误的? 问一下大家,有没有熟悉工控机的? ?请教关于main函数的args参数问题? 那位大虾帮帮忙 搜寻搜索引擎接口 史上最全Java线程编程资料 jsp连接db2数据库问题 请问jpx是可以直接运行的文件吗?等于exe吗? 求解JAVA家族关系 怎样获取本地目录下某个文件的大小? 推荐几本JAVA和OOP思想的好书 J关于AVA输入流的问题 关于“吞食”异常,这个概念不太明白,请各位帮忙解答下~~~
因为只有主线程一个线程在执行
当执行
if(list.size() <=0)
wait();
的时候
就停住不往下走了
自然就不会触发notify()方法了。
执行pop后都把list锁住了,后边的push就在synchronized (list)一句堵住了
Object mutex ; LinkedList<Object> list ; public TestStack2() {
} public TestStack2(LinkedList<Object> list ,Object mutex) {
this.list = list;
this.mutex = mutex;
}
public void push(Object x) {
synchronized (mutex) {
list.addLast(x);
mutex.notifyAll();
}
} public Object pop() throws Exception {
synchronized (mutex) {
if(list.size() <=0)
mutex.wait();
return list.removeLast();
}
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO 自动生成方法存根
LinkedList<Object> list = new LinkedList<Object>();
Object mutex = new Object();
for(int i = 0;i < 3; i++)
new TDeleteObject(list,mutex).start();
for(int i = 0;i < 3; i++)
new TAddObject(list,mutex).start();
}}class TAddObject extends Thread{
TestStack2 test ;
public TAddObject(LinkedList<Object> list,Object mutex) {
test = new TestStack2(list,mutex);
}
public void run(){
test.push(Thread.currentThread().getName());
}
}class TDeleteObject extends Thread {
TestStack2 test ;
public TDeleteObject(LinkedList<Object> list,Object mutex) {
test = new TestStack2(list,mutex);
}
public void run(){
try {
String str = test.pop().toString();
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
}结果为什么有时候是错误的?