我有以下java游戏应用程序(使用java8)代码,该代码在多线程环境中运行:
职位分级:
public class Position {
private final String name;
public Position(String name) {
this.name = name;
}
public String getName() {
return name;
}
public synchronized boolean acquire() {
boolean positionStatus = false;
//some business logic goes here to check if positionStatus can be made to true
positionStatus = true;
return positionStatus;
}
public synchronized boolean release() {
//release code
return true;
}
}
客户类:
import java.util.ArrayList;
import java.util.List;
public class Icon extends Thread {
private String name;
private List<Position> positions = new ArrayList<>();
public Customer(String name, List<Icon> positions) {
this.name = name;
this.positions = positions;
}
@Override
public void run() {
try {
for(Position position : positions) {
if (position.acquire()) {
//some business logic goes here
System.out.println("position acquired :"+name);
} else {
System.out.println("position not available **** ");
}
}
} catch(Exception exe) {
System.out.println(exe);
}
}
public static void main(String[] args) {
List<Position> positions = new ArrayList<>();
positions.add(new Position("Position1"));
positions.add(new Position("Position2"));
positions.add(new Position("Position3"));
positions.add(new Position("Position4"));
Icon icon1 = new Icon("icon1", positions);
Icon icon2 = new Icon("icon2", positions);
Icon icon3 = new Icon("icon3", positions);
Icon icon4 = new Icon("icon4", positions);
icon1.start();
icon2.start();
icon3.start();
icon4.start();
}
}
我的要求是将多个图标同时移动到不同的位置,因此我无法限制对Icon的序列化访问。
基本上,我有一个固定的每个图标的位置列表,我正在尝试获取每个位置&#39;为图标。
现在,我如何确保Icon1首先获取Position1,Position2,Position3,Position4,然后是Icon2(一旦Icon1完成Position1就应该选择Position1),然后是Icon3等。
我不想使用Thread join,因为它让Icon2等到Icon1完成获取整个Position的列表。 相反,我需要Icon2在Icon1完成后立即获取Position1。
我知道实现这一目标的一种方法是对位置的获取()中的Icon详细信息(或图标线程ID)进行硬编码,然后比较/写入一个逻辑来wait()并通知()Icon线程
我正在寻找一种替代方法,其中acquire()方法是灵活的,即,它不会比较任何Icon细节,而是它应该简单地发信号或发送一个事件,它将使用Position1完成以下操作Icon1被Icon1获取后的图标(如果有的话),即我希望Icon2线程监听Icon1获取事件等。
你可以帮忙吗?如果这个设计很复杂,你能否建议一个更简单的设计来实现这个目标(而不是进行串行访问,因为我的要求本身是平行移动多个图标)?答案 0 :(得分:0)
注意:以下答案基于您的原始代码。
。不需要单独的Position类为了按顺序处理客户,程序必须知道客户的订单。我建议在创建Customers时,将它们放在同步列表中以跟踪它们的优先级。 List是同步的,因为它需要是线程安全的。
每个产品都需要跟踪哪些客户已经订购了产品,因此它知道哪些订单是合法的。一种方法是使用包含最新Customer的volatile字段来订购产品。该字段对于线程安全是不稳定的。
通过调用未同步的prepareToOrder()方法替换对order()的调用。 prepareToOrder()方法检查订购产品的最新客户是否是客户优先级列表中呼叫客户之前的客户。如果是,则调用order()方法。如果没有,它会等待并循环回到最近一次客户的检查。
order()方法保持同步,除了现有功能外,还更新最新客户以订购产品。
除此之外,还有各种可能的优化,具体取决于您的具体要求,但这应该可以帮助您。