小编Ada*_*ski的帖子

LinkedBlockingQueue vs ConcurrentLinkedQueue

我的问题涉及前面提到的这个问题.在我使用队列进行生产者和消费者线程之间的通信的情况下,人们通常会建议使用LinkedBlockingQueueConcurrentLinkedQueue

使用一个优于另一个的优点/缺点是什么?

从API的角度来看,我可以看到的主要区别是a LinkedBlockingQueue可以选择性地限制.

java queue concurrency multithreading data-structures

104
推荐指数
3
解决办法
5万
查看次数

是一个"无限"迭代器糟糕的设计?

通常认为提供Iterator"无限"的实现是不好的做法; 即对hasNext()always(*)的调用返回true的位置?

通常我会说"是",因为调用代码可能表现不正常,但在下面的实现hasNext()中将返回true,除非调用者从List中删除迭代器初始化的所有元素; 即存在终止条件.你认为这是合法用途Iterator吗?它似乎没有违反合同,虽然我认为有人可能认为这是不直观的.

public class CyclicIterator<T> implements Iterator<T> {
  private final List<T> l;
  private Iterator<T> it;

  public CyclicIterator<T>(List<T> l) {
    this.l = l;
    this.it = l.iterator();
  }

  public boolean hasNext() {
    return !l.isEmpty();
  }

  public T next() {
    T ret;

    if (!hasNext()) {
      throw new NoSuchElementException();
    } else if (it.hasNext()) {
      ret = it.next();
    } else {
      it = l.iterator();
      ret = it.next();
    }

    return ret;
  }

  public void …
Run Code Online (Sandbox Code Playgroud)

java collections iterator

66
推荐指数
4
解决办法
5705
查看次数

使用volatile是否有任何意义?

我偶尔会使用一个volatile实例变量,在这种情况下,我有两个线程读取/写入它并且不希望获得锁定的开销(或潜在的死锁风险); 例如,计时器线程定期更新在某些类上作为getter公开的int ID:

public class MyClass {
  private volatile int id;

  public MyClass() {
    ScheduledExecutorService execService = Executors.newScheduledThreadPool(1);
    execService.scheduleAtFixedRate(new Runnable() {
      public void run() {
        ++id;
      }
    }, 0L, 30L, TimeUnit.SECONDS);
  }

  public int getId() {
    return id;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:鉴于JLS只能保证32位读取将是原子有任何一点曾经使用挥发性长时间?(即64位).

警告:请不要回复说使用volatile结束synchronized是预优化的情况; 我很清楚如何/何时使用,synchronized但有些情况volatile更可取.例如,在定义用于单线程应用程序的Spring bean时,我倾向于使用volatile实例变量,因为无法保证Spring上下文将初始化主线程中的每个bean的属性.

java concurrency multithreading volatile

53
推荐指数
3
解决办法
1万
查看次数

检查BigDecimal是否为整数值

任何人都可以推荐一种有效的方法来确定a是否BigDecimal是数学意义上的整数值?

目前我有以下代码:

private boolean isIntegerValue(BigDecimal bd) {
    boolean ret;

    try {
        bd.toBigIntegerExact();
        ret = true;
    } catch (ArithmeticException ex) {
        ret = false;
    }

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

...但是如果有必要,我希望避免对象创建开销.以前我正在使用bd.longValueExact()哪个会避免创建一个对象,如果BigDecimal它在内部使用它的紧凑表示,但显然会失败如果值太大而不适合长.

任何帮助赞赏.

java bigdecimal

46
推荐指数
5
解决办法
3万
查看次数

灵活的CountDownLatch?

我现在遇到了两次问题,即生产者线程生成N个工作项,将它们提交给a ExecutorService,然后需要等到所有N个项都被处理完毕.

注意事项

  • N事先不知道.如果是这样的话,我只需创建一个CountDownLatch然后拥有生产者线程,await()直到所有工作完成.
  • 使用a CompletionService是不合适的,因为虽然我的生产者线程需要阻塞(即通过调用take()),但是没有办法表明所有工作都已完成,导致生产者线程停止等待.

我目前最喜欢的解决方案是使用整数计数器,并在提交工作项时递增它,并在处理工作项时递减它.在所有N个任务的提交之后,我的生产者线程将需要等待锁定,检查是否counter == 0通知它.如果消费者线程已经递减计数器并且新值为0,则消费者线程将需要通知生产者.

有没有更好的方法解决这个问题,或者java.util.concurrent我应该使用合适的构造而不是"滚动自己的"?

提前致谢.

java concurrency multithreading countdownlatch phaser

24
推荐指数
1
解决办法
7557
查看次数

结合java.util.Dates来创建日期时间

我目前有两个UI组件用于指定日期和时间.两个组件分别返回java.util.Date表示日历日期和时间的实例.我的问题是:

组合这些值以创建java.util.Date表示日期和时间的实例的最佳方法是什么? 我想避免依赖Joda或其他第三方库.

我目前的解决方案看起来像这样(但有更好的方法吗?):

Date date = ... // Calendar date
Date time = ... // Time

Calendar calendarA = Calendar.getInstance();
calendarA.setTime(date);

Calendar calendarB = Calendar.getInstance();
calendarB.setTime(time);

calendarA.set(Calendar.HOUR_OF_DAY, calendarB.get(Calendar.HOUR_OF_DAY));
calendarA.set(Calendar.MINUTE, calendarB.get(Calendar.MINUTE));
calendarA.set(Calendar.SECOND, calendarB.get(Calendar.SECOND));
calendarA.set(Calendar.MILLISECOND, calendarB.get(Calendar.MILLISECOND));

Date result = calendarA.getTime();
Run Code Online (Sandbox Code Playgroud)

java datetime

21
推荐指数
1
解决办法
2万
查看次数

以OO方式进行游戏设计

我正在设计一个简单的游戏,它使用Java 2D和牛顿物理.目前我的主要"游戏循环"看起来像:

do {
  for (GameEntity entity : entities) {
    entity.update(gameContext);
  }

  for (Drawable drawable : drawables) {
    drawable.draw(graphics2d);
  }
} while (gameRunning);
Run Code Online (Sandbox Code Playgroud)

当指示实体自我更新时,它将根据施加于其上的当前力来调整其速度和位置.但是,我需要实体展示其他行为; 例如,如果玩家射杀了"坏人",则该实体应该被摧毁并从游戏世界中移除.

我的问题:以面向对象的方式实现这一目标的最佳方法是什么?到目前为止,我所见过的所有例子都将游戏循环合并到一个称为类似的神类中Game,执行步骤:检测碰撞,检查是否坏人杀死,检查是否被玩家杀死,重新绘制等等.封装了所有游戏状态(剩下的生命等).换句话说,它是非常程序化的,所有逻辑都在Game类中.有谁能推荐更好的方法?

以下是我到目前为止所考虑的选项:

  • GameContext如果需要,将a传递给实体可以从中移除的每个实体,或更新游戏状态(例如,如果玩家被杀,则"不运行").
  • 将每个人注册GameEntity为中央Game班级的听众,并采取面向事件的方法; 例如,碰撞会导致CollisionEvent向碰撞中的两个参与者发射.

java oop java-2d

21
推荐指数
2
解决办法
4261
查看次数

高效的hashCode()实现

我经常hashCode()使用IntelliJ IDEA 自动生成类的方法,通常该方法采用以下形式:

result = 31 * result + ...
Run Code Online (Sandbox Code Playgroud)

我的问题是乘以31的目的是什么?我知道这是一个素数,但为什么选择31?此外,如果hashCode()为特别小/大的数据集实现a ,人们会以不同的方式处理这个问题吗?

java algorithm hashmap hashcode data-structures

13
推荐指数
1
解决办法
2929
查看次数

检测闭合Bezier曲线中的自交叉

我通过将立方贝塞尔曲线拼接在一起创建了一个"blob"形状(截图如下).我希望能够检测到曲线越过自身或其他曲线的情况,并且想知道是否有推荐的方法或已知的算法来执行此操作?

我的一个想法是使用a FlatteningPathIterator将形状分解为直线段然后检测给定的段是否与另一个段相交,但我对是否有更好的方法感兴趣(因为这将具有二次性能).如果我继续追求这种方法,Java中的库函数是否检测两个线段是否重叠?

谢谢.

没有交叉

No Crossover http://www.freeimagehosting.net/uploads/7ad585414d.png

交叉

交叉http://www.freeimagehosting.net/uploads/823748f8bb.png

java algorithm geometry bezier java-2d

10
推荐指数
1
解决办法
2402
查看次数

未检测到XmlJavaTypeAdapter

希望对JAXB专家来说很简单:

我试图编组一个定义默认无参数构造函数的不可变类.我已经定义了一个XmlAdapter实现,但它似乎没有被选中.我已经整理了一个简单的自包含示例,但仍然无法正常工作.谁能告诉我我做错了什么?

不变的阶级

@XmlJavaTypeAdapter(FooAdapter.class)
@XmlRootElement
public class Foo {
  private final String name;
  private final int age;

  public Foo(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() { return name; }
  public int getAge() { return age; }
}
Run Code Online (Sandbox Code Playgroud)

适配器和值类型

public class FooAdapter extends XmlAdapter<AdaptedFoo, Foo> {
  public Foo unmarshal(AdaptedFoo af) throws Exception {
    return new Foo(af.getName(), af.getAge());
  }

  public AdaptedFoo marshal(Foo foo) throws Exception {
    return new AdaptedFoo(foo);
  } …
Run Code Online (Sandbox Code Playgroud)

java jaxb

9
推荐指数
1
解决办法
5028
查看次数