Вход на сайт
вопрос по java
193 просмотров
Перейти к просмотру всей ветки
в ответ Sevaforever 20.07.05 13:53
class Q {
int n;
synchronized int get() {
System.out.println("Got: " + n,0);
return n;
}
synchronized void put(int n) {
this.n = n;
System.out. println("Put: " + n,0);
} }
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start(,0);
}
public void run() {
int i = 0;
while (true) {
q.put(i++,0);
} } }
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start(,0);
}
public void run() {
while (true) {
q.get(,0);
}
} }
class PC {
public static void main(String args[]) {
Q q = new Q(,0);
new Producer(q,0);
new Consumer(q,0);
} }
эта программа выводит на экоан цифры, но не так как нужно
в справочнике далее написан исправленный вариант:
class Q {
int n;
boolean valueSet = false;
synchronized int get() {
if (!valueSet)
try wait(,0);
catch(InterruptedException e):
System.out.println("Got: " + n,0);
valueSet = false;
notify(,0);
return n;
}
synchronized void put(int n) {
if (valueSet)
try wait(,0); catch(InterruptedException e,0);
this.n = n;
valueSet = true;
System.out.println("Put: " + n,0);
notify(,0);
} }
далее программа не дописана...
так вот у меня возник вопрос что же нужно
вставлять в операторе while()
я так понимаю что true не подходит, потому что в if стоит переменная valueset,
но ее вроде как тоже нельзя ставить, как и !valueset, т.к. по-моему в этом
случае будет работать только один из методав, а другой будет в режиме wait...
возможно это не так... прошу объяснить поподробнее, заранее благодарен
жизнь хороша, когда пьешь не спеша...
int n;
synchronized int get() {
System.out.println("Got: " + n,0);
return n;
}
synchronized void put(int n) {
this.n = n;
System.out. println("Put: " + n,0);
} }
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start(,0);
}
public void run() {
int i = 0;
while (true) {
q.put(i++,0);
} } }
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start(,0);
}
public void run() {
while (true) {
q.get(,0);
}
} }
class PC {
public static void main(String args[]) {
Q q = new Q(,0);
new Producer(q,0);
new Consumer(q,0);
} }
эта программа выводит на экоан цифры, но не так как нужно
в справочнике далее написан исправленный вариант:
class Q {
int n;
boolean valueSet = false;
synchronized int get() {
if (!valueSet)
try wait(,0);
catch(InterruptedException e):
System.out.println("Got: " + n,0);
valueSet = false;
notify(,0);
return n;
}
synchronized void put(int n) {
if (valueSet)
try wait(,0); catch(InterruptedException e,0);
this.n = n;
valueSet = true;
System.out.println("Put: " + n,0);
notify(,0);
} }
далее программа не дописана...
так вот у меня возник вопрос что же нужно
вставлять в операторе while()
я так понимаю что true не подходит, потому что в if стоит переменная valueset,
но ее вроде как тоже нельзя ставить, как и !valueset, т.к. по-моему в этом
случае будет работать только один из методав, а другой будет в режиме wait...
возможно это не так... прошу объяснить поподробнее, заранее благодарен
жизнь хороша, когда пьешь не спеша...
Мы работаем ╚с огоньком╩!Городской крематорий.
