我在Java 1.6中使用ExecutoreService,简单地开始
ExecutorService pool = Executors.newFixedThreadPool(THREADS).
Run Code Online (Sandbox Code Playgroud)
当我的主线程完成时(以及线程池处理的所有任务),此池将阻止我的程序关闭,直到我显式调用
pool.shutdown();
Run Code Online (Sandbox Code Playgroud)
我可以避免不得不通过某种方式将此池使用的内部线程管理变为deamon线程来调用它吗?或者我在这里遗漏了一些东西.
我想在我的服务器上模拟(不安全)客户端代码,我正在寻找一种合适的语言来实现.我希望客户端使用与我用来模拟的语言相同的语言.
理想情况下,我只需构建一些接口(并发布这些接口),加载客户端代码,并通过允许它仅使用我的接口+我仔细选择的标准API的子集来模拟该代码.
在此模拟期间,我应该能够限制客户端代码使用的资源(时间和内存).如果我可以逐步模拟代码,那么我将总是可以返回确定性解决方案.
性能不是真正的问题.这个想法是允许客户为小型游戏/拼图编写自定义AI.游戏将被模拟(在服务器上!)并且结果返回给用户.
最初我在考虑自己构建一个外部DSL,包括解析器和评估器,但也许有一个现成的解决方案?
我有以下代码:注意:为了便于阅读,我尽可能地简化了代码.如果我忘了任何关键的部分让我知道.
public class User(){
private Relations relations;
public User(){
relations = new Relations(this);
}
public getRelations(){
return relations;
}
}
public class Relations(){
private User user;
public Relations(User user){
this.user = user;
}
public synchronized void setRelation(User user2){
Relations relations2 = user2.getRelations();
synchronized(relations2){
storeRelation(user2);
if(!relations2.hasRelation(user))
relations2.setRelation(user);
}
}
public synchronized boolean hasRelation(User user2){
... // Checks if this relation is present in some kind of collection
}
/*Store this relation, unless it is already present*/
private void storeRelation(User user2){
... …
Run Code Online (Sandbox Code Playgroud) 我想写这个:
paths( Result ) :-
findall( B, f(B) , Result ).
f( B ) :-
f1( B ),
f2( B ).
Run Code Online (Sandbox Code Playgroud)
只有一行.所以基本上是这样的:
paths( Result ) :-
findall( B, f1(B) AND f2(B), Result ).
Run Code Online (Sandbox Code Playgroud)
我不知道如何在目标陈述中表达'AND'.这有可能吗?
这段代码不会编译:
synchronized( obj ) {
Object a = new Object()
}
System.out.println( a.toString() );
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么..我的理解是同步块总是最终被执行,所以我希望在synchronized块之后的代码能够知道任何新的声明变量.我哪里错了?
java ×4
synchronized ×2
c# ×1
deadlock ×1
java-threads ×1
javascript ×1
locking ×1
prolog ×1
sandbox ×1
security ×1
threadpool ×1