我正在阅读关于"Modern Java Concurrency"的"JAX London 2011" 演讲.在持续时间43:20 - 43:40之间,观众中的一个人说shutdown
下面代码中的变量应该被声明为volatile
并且演示者同意它(并且说它之前也被指出过,但它们只是没有得到修改演示文稿).有问题的代码是:
public abstract class QueueReaderTask implements Runnable {
private boolean shutdown = false;
protected BlockingQueue<WorkUnit<String>> lbq;
public void run() {
while (!shutdown) {
try {
WorkUnit<String> wu = lbq.poll(10, TimeUnit.MILLISECONDS);
if (wu != null) { doAction(wu.getWork()); }
} catch (InterruptedException e) {
shutdown = true;
}
}
}
public abstract void doAction(String msg);
public void setQueue(BlockingQueue<WorkUnit<String>> q) { lbq = q; }
}
Run Code Online (Sandbox Code Playgroud)
我的问题:我不认为shutdown
应该宣布 …
我们正在考虑在我们的Java服务器端应用程序中使用MongoDB作为我们的数据库.在我之前的项目中,我们使用Hibernate抽象底层SQL数据库,以便我们可以在不更改应用程序代码的情况下从MySQL切换到Postgres(例如).(这是Hibernate给我们提供的除了通常的ORM功能之外的一个+).
我为面向文档的NoSQL数据库搜索了一个类似的抽象层,结果没有结果!
虽然MongoDB满足了我们今天的要求,但如果一个更好的面向文档的NoSQL DB出现3年后,我们不想更改我们的应用程序代码以转移到新的数据库.
一个解决方案是我们自己编写抽象层(如果我们没有其他选项,我们就会这样做).
但是如果来自ORM世界的人们直接编码到NoSQL数据库接口上,我会感到惊讶吗?数据库独立性在NoSQL世界中不是一个问题吗?或者通过其他方式实现?
def city_generator():
print("city gen called")
return 1 # <--- over simplified to drive the point of the question
yield "amsterdam"
yield "los angeles"
>>> citygenobj = city_generator()
>>> print(citygenobj)
<generator object city_generator at 0x02CE73B0>
>>> next(citygenobj)
city gen called
Traceback (most recent call last):
File "<pyshell#137>", line 1, in <module>
next(citygenobj)
StopIteration: 1
Run Code Online (Sandbox Code Playgroud)
问题:此函数是否充当生成器是否取决于python实现?还是python语言规范保证如果您有一条yield
语句,则无论生成器是否yield
可达,它都是生成器?
我看到一个典型的addXXXListener()返回void!我已经将其视为一种全面的实践,无论是UI框架(如Swing)还是服务器端框架.
例如:Class:AsyncContext
public void addAsyncListener(AsyncListener listener);
Run Code Online (Sandbox Code Playgroud)
public void addActionListener(ActionListener l)
Run Code Online (Sandbox Code Playgroud)
还有很多其他例子......
我们是否有兴趣知道添加侦听器调用是否成功完成?如果组件处于无法添加侦听器的状态,该怎么办?
例如:考虑Guava库[ListenableFuture](http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/util/concurrent/ListenableFuture.html#addListener (java.lang).Runnable,java.util.concurrent.Executor))
它有一个
void addListener(Runnable listener, Executor exec);
Run Code Online (Sandbox Code Playgroud)
它的行为是在Future的计算完成时执行监听器.他们采取的方法是,如果Future已经完成,那么将立即调用监听器.即使未来完成了年龄的回归.用户没有迹象表明他们在已经完成的未来上不必要地调用addListener()!
我认为addListener()应该能够返回一个值(boolean?),该值表示如果可以成功添加监听器,并且如果无法添加监听器,则让调用者进行处理!
我知道必须有一些理由为什么所有addListeners都是这样编写的.我只是不知道为什么?
java ×2
ajax ×1
coding-style ×1
couchdb ×1
database ×1
generator ×1
http ×1
javascript ×1
listener ×1
mongodb ×1
nosql ×1
python ×1
python-3.x ×1
return-value ×1
spine.js ×1
volatile ×1
yield ×1