这是一个我以前成绩很差的试题,但这次我试着把它做好。如果有人能指出正确的方向,我会很感激的,谢谢。
我的问题是,提供的解决方案在任何方面是否正确解决问题?怎么才能改进呢。
我的代码遵循这个问题。
问题:
事件对象有两种状态之一:信号状态或无信号状态。当事件处于信号状态时,将释放所有或一个等待线程。当将其重置为无信号状态时,所有用户线程都将被迫等待。事件一直处于信号状态,直到重置为无信号状态为止。基本思想是一个或多个线程可以等待某个事件的发生。当事件等待发生时,线程会采取所需的任何操作。使用等待/通知写入事件类。
我的尝试:
class Event {
boolean signal;
String obj = new String();
public Event(boolean signal) {
this.signal = signal;
}
synchronized void getSignal(){
while(!signal)
try{
wait();
}
catch(InterruptedException e) {}
}
public void setSignal(boolean signal) {
synchronized (this) {
this.signal = signal;
this.notifyAll();
}
}
}发布于 2012-08-16 02:48:42
我做了这个测试课,我认为这是答案,我的事件在某种程度上类似于你的。
一个线程正在等待事件发生(在发出信号时),然后等待重置,而另一个线程正在激活并不时地解除该信号。
编辑:,我不知道你的简单问题,所以也许这段代码对你没用。不管怎样,你的活动课应该能工作,所以我能说什么呢?
public class SynchronizationTest {
public class Event {
boolean signal = false;
synchronized String getEvent(){
while(!signal) {
try{
wait();
}
catch(InterruptedException e) {}
}
return "This is an event";
}
synchronized public void waitNextEvent(){
while(signal) {
try{
wait();
}
catch(InterruptedException e) {}
}
}
synchronized public void setSignal(boolean signal) {
this.signal = signal;
this.notifyAll();
}
}
class EventChecker extends Thread {
private Event event;
public EventChecker(Event event) {
this.event=event;
}
public void run(){
while (true) {
String eventStr = event.getEvent();
System.out.println("EventChecker: Got event '"+eventStr+"'");
System.out.println("EventChecker: wait for new event.. \n");
event.waitNextEvent();
}
}
}
class EventSignaler extends Thread {
private Event event;
public EventSignaler(Event event) {
this.event=event;
}
public void run(){
while (true) {
event.setSignal(true);
System.out.print("EventSignaler: Sending new signal\n");
try {
sleep((int) (Math.random()*2200));
} catch(Exception e){}
event.setSignal(false);
System.out.print("EventSignaler: Deactivating signal\n\n");
try {
sleep((int) (Math.random()*4200));
}
catch(Exception e){}
}
}
}
public void startTest() {
Event event=new Event();
EventSignaler eventSignaler = new EventSignaler(event);
EventChecker eventChecker=new EventChecker(event);
eventSignaler.start();
eventChecker.start();
}
public static void main(String arg[]) {
SynchronizationTest synchro = new SynchronizationTest();
synchro.startTest();
}
}发布于 2012-08-16 03:44:06
您的代码将正确回答您提出的问题。
有几个小小的优化可以完成:
setSignal()方法,从而消除了额外同步代码区域的需要。notifyAll()也会唤醒所有的wait()'ing线程。在setSignal()中,如果信号从锁定/阻塞状态转到未锁定状态,可以通过检查来避免一些开销。如果是,通知。如果没有,什么也不做。obj是不必要的。https://stackoverflow.com/questions/11979704
复制相似问题