我读到了Java 7中引入的Fork/Join框架的实现,我只是想检查一下我是否理解了魔法是如何工作的.
据我所知,当一个线程分叉时,它会在其队列中创建子任务(其他线程可能会或可能不会被窃取).当线程尝试"加入"时,它实际上检查其队列中的现有任务,然后递归执行它们,这意味着对于任何"连接"操作 - 将在线程调用堆栈中添加2个帧(一个用于连接,一个用于连接)对于新的任务调用).
据我所知,JVM不支持尾调用优化(在这种情况下可以用于删除连接方法堆栈帧)我相信在执行带有大量分支和连接的复杂操作时,线程可能会抛出StackOverflowError.
我是对的还是他们找到了一些防止它的好方法?
编辑
这是一个帮助澄清问题的场景:说(为简单起见)我们在forkjoin池中只有一个线程.在某个时间点 - 线程分叉然后调用join.在join方法中,线程发现它可以执行分叉任务(因为它在队列中找到),因此它调用下一个任务.此任务依次分叉然后调用join - 因此在执行join方法时,线程将在其队列中找到分叉任务(如前所述)并调用它.在该阶段,调用堆栈将至少包含两个连接和两个任务的帧.
正如您所看到的,fork join框架转换为普通递归.因为java不支持尾调用优化 - java中的每次递归都会导致StackOverflowError它变得足够深.
我的问题是 - fork/join框架的实现者是否找到了防止这种情况的一些很酷的方法.
在我正在研究的项目中,我有两个高度依赖于彼此的类:
@Singleton
class WorkExecutor {
@Inject Provider<ExecutionServices> services;
...
public void execute(Work w){
w.execute(services.get());
...
}
...
}
class ExecutionServicesImpl implements ExecutionServices {
@Inject WorkExecutor executor;
...
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,在执行工作时,工作可以访问多个服务 - 其中一个是执行程序本身,这样工作就可以执行子工作.
可以看出,这里有一个循环依赖,但我发现很难打破.
主要问题是WorkExecutor在图形构建时实际上并不需要ExecutionServices对象的实例,而只需要稍后使用的提供程序.遗憾的是,Dagger不知道WorkExecutor不会从类的构造函数中调用ExecutionServices提供程序,因此它猜测ExecutionServices依赖于WorkExecutor,反之亦然.
我找到的一个可能的解决方案是以下列方式定义模块和组件:
interface DelayedProvider<T> extends Provider<T>{}
@Module
class AppModule {
Provider<ExecutionServices> delayedProvider = null;
@Provides DelayedProvider<ExecutionServices> provideDelayed() {
return () -> delayedProvider.get();
}
@Provides @Named("late-binding-conf") Void latebindingConf(Provider<ExecutionServices> eager){
this.delayedProvider = eager;
return null; //notice we returning Void and not void
}
}
@Component(modules=AppModule.class)
interface AppComponent {
App app(); …Run Code Online (Sandbox Code Playgroud) 我想计算N个整数的不同有序组的数量,以便每个组的元素总和为A.
例如:如果N = 3且A = 3,则结果应为10:
1 = [3,0,0]
2 = [2,1,0]
3 = [1,2,0]
4 = [0,3 ,0]
5 = [2,0,1]
6 = [1,1,1]
7 = [0,2,1]
8 = [1,0,2]
9 = [0,1,2]
10 = [0,0,3]
我这样做的方式是蛮力:
public static int calc(int a, int n){
if (n <= 1 || a == 0) return 1;
int sum = 0;
for (int i=0; i<=n; i++)
sum += calc(a - i, n - 1);
return sum;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑可能有更好的方法(我错过了一些数学计算......)吗?
编辑 在原始问题中,我忘了考虑订单
我正在寻找一种方法来获得仅使用其内容呈现的组件.例如,给定组件:
@Component({selector: 'my-cmp', template: '<div> my-cmp </div>'})
class MyComponent {
}
Run Code Online (Sandbox Code Playgroud)
使用angular2渲染它会将以下内容添加到DOM:
<my-cmp>
<div> my-cmp </div>
</my-cmp>
Run Code Online (Sandbox Code Playgroud)
虽然我想找到一种方法直接渲染它:
<div> my-cmp </div>
Run Code Online (Sandbox Code Playgroud)
可悲的是,因为角度2相对较新(只是测试版) - 谷歌没有那么有用,更不用说当前的文档是多么缺乏..
我的javafx应用程序中有一个样式类为"test"的标签.我想在这个标签周围添加白色边框,所以在css文件中我试过:
-fx-border-width: 2;
-fx-border-color: white;
Run Code Online (Sandbox Code Playgroud)
但那没有用,所以我试着添加:
-fx-border-style: solid;
Run Code Online (Sandbox Code Playgroud)
但这也没有用,在javafx css引用后我没有找到任何有用的东西.我究竟做错了什么?
我正在尝试将背景图像添加到我的javafx应用程序中的某个窗格中,该图像位于包resources.img内,而css位于包resource.css中
如果我像这个线程中建议的那样以编程方式 设置背景图像:通过javafx代码设置背景图像(不是css)
它工作正常但我想知道我是否可以从css文件本身设置背景图像.
我试过了
-fx-background-image: url("@../img/myImage.png");
Run Code Online (Sandbox Code Playgroud)
但后来css解释器没找到图像文件.有可能通过CSS做我想做的事吗?
在使用JavaFX时,我正在努力处理一些CSS样式.
我想知道是否有任何方法来调试CSS?
像firebug或chrome中的内置工具一样,当你按下一个css样式适用于它的元素时会显示你.
我是一个 TypeScript 初学者,但我有 Java 开发经验,我想知道用 TypeScript 编写的推荐文件结构是什么 - 特别是在涉及模块时。
比方说,我有几个模块:ui.dashboard,ui.models,util.events,和util.common。
这些模块中的每一个都可能包含多个类。在 Java 中,我将拥有以下文件结构(<base>项目的基本包在哪里,例如 com.my.app):
src/<base>/ui/dashboard/<file per class>
src/<base>/ui/models/<file per class>
src/<base>/util/events/<file per class>
src/<base>/util/common/<file per class>`
Run Code Online (Sandbox Code Playgroud)
另一方面,在 TypeScript 中,我看到了两种主要的方法来完成同样的事情:
src/ui.dashboard.js
src/ui.models.js
src/util.events.js
src/util.common.js
Run Code Online (Sandbox Code Playgroud)
这里的每个文件都包含一个包含所有相关类的模块定义。这没问题,但随后文件变得庞大且难以管理。
在这个设计中,我会像在 Java 中一样组织文件,但是由于 TypeScript(据我所知)不支持跨文件声明模块,我将不得不编写一个 gulp/grunt 任务,将文件组合成模块构建时间。
作为一名 Java 程序员,这看起来更优雅,但随后我失去了一些工具支持,因为模块直到构建时才真正定义,因此对编辑器/IDE 不可见。
推荐的工作方式是什么?
我有两个类定义如下:
class A {
public static String getName(){
Class c = getCalledClass();
return c.getSimpleName();
}
}
class B extends A {
//no methods are defined here!
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以组合static方法getCalledClass(),以便调用A.getName()将返回A并B.getName()返回B?
谢谢.
我正在为 Eclipse 构建一个注释处理器插件,我想做的是在处理过程中检查项目文件夹内的几个文件。
我想知道如何从我的处理器中获取项目路径。我相信这是可以完成的,因为项目源路径已提供给处理器 - 但我找不到到达它的方法。
我尝试查看 System.properties 和processingEnv.getOptions(),但那里没有有用的信息。
最终我也想在 Netbeans 上使用这个注释处理器,所以如果有一个公共 API 可以提供这些信息,那将是最好的 - 但任何帮助将不胜感激。
java ×8
css ×3
javafx-2 ×2
angular ×1
concurrency ×1
dagger-2 ×1
debugging ×1
eclipse ×1
fork-join ×1
java-7 ×1
javafx ×1
javascript ×1
math ×1
reflection ×1
styles ×1
styling ×1
typescript ×1