首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java线程事件通知

java线程事件通知
EN

Stack Overflow用户
提问于 2016-10-17 13:49:18
回答 1查看 103关注 0票数 0

我有下面的java游戏应用程序(使用java8)代码,它运行在多线程环境中:

职位类:

代码语言:javascript
复制
 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;
     }
    }

客户类:

代码语言:javascript
复制
 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();
  }
}

我的要求是同时移动多个图标到不同的位置,所以我不能限制对图标的序列化访问。

基本上,我已经有一个固定的立场为每个图标和我试图获得每个‘位置’的图标。

现在,如何确保Icon1收购Position1、Position2、Position3、Position4,然后是Icon2 ( Icon1完成Position1后应立即选择Position1),然后是Icon3等。

我不想使用线程连接,因为它使Icon2等待直到Icon1完成获取全部位置列表。相反,我需要Icon2在Position1完成后立即收购Icon1。

我知道实现这一目标的一种方法是硬编码Icon details(或Icon线程ids)在位置的wait()中,然后比较/编写等待()和通知()图标线程的逻辑。

我正在寻找一种替代的方法,即获取()方法是灵活的。它不比较任何图标的细节,而是应该简单地向以下图标(如果有的话)发送一个用Position1完成的事件(如果有的话),只要Position1被Icon1获得,也就是说,我希望Icon2线程侦听Icon1获取事件,等等。

你能帮忙吗?如果这个设计很复杂,你能建议一个更简单的设计来实现这个目标(而不是因为我的要求是并行移动多个图标)而采用串行访问方式吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-17 19:11:46

注意:下面的答案是基于您的原始代码。不需要单独的职位类。

为了有序地与客户打交道,程序必须知道客户的顺序。我建议您在创建客户时,将它们放在一个同步列表中,以跟踪它们的优先级。列表是同步的,因为它需要线程安全。

每个产品都需要跟踪哪些客户已经订购了该产品,因此它知道哪些订单是合法的。这样做的一种方法是拥有一个包含最近的客户来订购产品的易失性字段。为了线程安全,该字段是不稳定的。

将对order()的调用替换为对不同步的prepareToOrder()方法的调用。prepareToOrder()方法检查最近订购产品的客户是否是客户优先级列表中调用客户之前的客户。如果是,则调用order()方法。如果没有,它将等待并循环回对最新客户的检查。

order()方法保持同步,除了其现有功能外,还更新最近的客户以订购产品。

根据您的确切需求,还有各种可能的优化,但这应该会让您开始工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40088174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档