我的问题涉及前面提到的这个问题.在我使用队列进行生产者和消费者线程之间的通信的情况下,人们通常会建议使用LinkedBlockingQueue或ConcurrentLinkedQueue?
使用一个优于另一个的优点/缺点是什么?
从API的角度来看,我可以看到的主要区别是a LinkedBlockingQueue可以选择性地限制.
通常认为提供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) 我偶尔会使用一个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的属性.
任何人都可以推荐一种有效的方法来确定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它在内部使用它的紧凑表示,但显然会失败如果值太大而不适合长.
任何帮助赞赏.
我现在遇到了两次问题,即生产者线程生成N个工作项,将它们提交给a ExecutorService,然后需要等到所有N个项都被处理完毕.
注意事项
CountDownLatch然后拥有生产者线程,await()直到所有工作完成.CompletionService是不合适的,因为虽然我的生产者线程需要阻塞(即通过调用take()),但是没有办法表明所有工作都已完成,导致生产者线程停止等待.我目前最喜欢的解决方案是使用整数计数器,并在提交工作项时递增它,并在处理工作项时递减它.在所有N个任务的提交之后,我的生产者线程将需要等待锁定,检查是否counter == 0通知它.如果消费者线程已经递减计数器并且新值为0,则消费者线程将需要通知生产者.
有没有更好的方法解决这个问题,或者java.util.concurrent我应该使用合适的构造而不是"滚动自己的"?
提前致谢.
我目前有两个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 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向碰撞中的两个参与者发射. 我经常hashCode()使用IntelliJ IDEA 自动生成类的方法,通常该方法采用以下形式:
result = 31 * result + ...
Run Code Online (Sandbox Code Playgroud)
我的问题是乘以31的目的是什么?我知道这是一个素数,但为什么选择31?此外,如果hashCode()为特别小/大的数据集实现a ,人们会以不同的方式处理这个问题吗?
我通过将立方贝塞尔曲线拼接在一起创建了一个"blob"形状(截图如下).我希望能够检测到曲线越过自身或其他曲线的情况,并且想知道是否有推荐的方法或已知的算法来执行此操作?
我的一个想法是使用a FlatteningPathIterator将形状分解为直线段然后检测给定的段是否与另一个段相交,但我对是否有更好的方法感兴趣(因为这将具有二次性能).如果我继续追求这种方法,Java中的库函数是否检测两个线段是否重叠?
谢谢.
没有交叉
No Crossover http://www.freeimagehosting.net/uploads/7ad585414d.png
交叉
希望对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)