这是一个考试问题,我之前得分很差,但这次试图把它弄好。如果有人能指出我正确的方向,我将不胜感激,谢谢。
我的问题是,提供的解决方案是否以任何方式正确解决问题?怎么可以改进呢。
我的代码遵循这个问题。
问题:
事件对象具有信号或非信号的两种状态之一。什么时候 事件处于信号状态,全部或一个等待线程 释放。当它被重置为所有用户的非信号状态时 线程将被迫等待。事件保持在信号状态 直到它重置为非信号状态。基本的想法是 一个或多个线程可以等待某个事件发生。当事件发生 等待发生线程采取任何需要的操作。运用 等待/通知写一个事件类。
我的尝试:
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();
}
}
}
答案 0 :(得分:0)
我做了这个测试课,我认为这个课程回答了这个问题,而且我的活动与你的相似。
线程正在等待事件发生(当发出信号时),然后在另一个线程正在激活和停用信号时等待重置。
编辑:我不知道你的简单问题,所以这段代码可能对你没用。 无论如何,你的Event类应该有效,那么我能说什么呢?
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();
}
}
答案 1 :(得分:0)
您的代码会正确回答您提出的问题。
可以做一些轻微的优化:
setSignal()
方法,无需额外的同步代码区域。notifyAll()
也会唤醒所有wait()
个线程。通过在setSignal()
中检查信号是否从锁定/阻塞状态变为解锁状态,可以避免一些开销。如果是,您通知。如果没有,什么也不做。obj
是不必要的。