小编ben*_*nyl的帖子

java Fork/Join有关堆栈使用情况的说明

我读到了Java 7中引入的Fork/Join框架的实现,我只是想检查一下我是否理解了魔法是如何工作的.

据我所知,当一个线程分叉时,它会在其队列中创建子任务(其他线程可能会或可能不会被窃取).当线程尝试"加入"时,它实际上检查其队列中的现有任务,然后递归执行它们,这意味着对于任何"连接"操作 - 将在线程调用堆栈中添加2个帧(一个用于连接,一个用于连接)对于新的任务调用).

据我所知,JVM不支持尾调用优化(在这种情况下可以用于删除连接方法堆栈帧)我相信在执行带有大量分支和连接的复杂操作时,线程可能会抛出StackOverflowError.

我是对的还是他们找到了一些防止它的好方法?

编辑

这是一个帮助澄清问题的场景:说(为简单起见)我们在forkjoin池中只有一个线程.在某个时间点 - 线程分叉然后调用join.在join方法中,线程发现它可以执行分叉任务(因为它在队列中找到),因此它调用下一个任务.此任务依次分叉然后调用join - 因此在执行join方法时,线程将在其队列中找到分叉任务(如前所述)并调用它.在该阶段,调用堆栈将至少包含两个连接和两个任务的帧.

正如您所看到的,fork join框架转换为普通递归.因为java不支持尾调用优化 - java中的每次递归都会导致StackOverflowError它变得足够深.

我的问题是 - fork/join框架的实现者是否找到了防止这种情况的一些很酷的方法.

java concurrency fork-join java-7

18
推荐指数
1
解决办法
1336
查看次数

匕首2循环依赖

在我正在研究的项目中,我有两个高度依赖于彼此的类:

@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)

java dagger-2

18
推荐指数
1
解决办法
2435
查看次数

总计为A的N个整数的不同组的数量

我想计算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)

我怀疑可能有更好的方法(我错过了一些数学计算......)吗?

编辑 在原始问题中,我忘了考虑订单

java math combinatorics

12
推荐指数
1
解决办法
1929
查看次数

用其内容替换组件 - 角度2

我正在寻找一种方法来获得仅使用其内容呈现的组件.例如,给定组件:

@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相对较新(只是测试版) - 谷歌没有那么有用,更不用说当前的文档是多么缺乏..

javascript angular

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

javafx 2.0向Label添加边框

我的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引用后我没有找到任何有用的东西.我究竟做错了什么?

css java user-interface javafx-2

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

JavaFX在css中使用"in jar"图像

我正在尝试将背景图像添加到我的javafx应用程序中的某个窗格中,该图像位于包resources.img内,而css位于包resource.css中

如果我像这个线程中建议的那样以编程方式 设置背景图像:通过javafx代码设置背景图像(不是css)

它工作正常但我想知道我是否可以从css文件本身设置背景图像.

我试过了

-fx-background-image: url("@../img/myImage.png");
Run Code Online (Sandbox Code Playgroud)

但后来css解释器没找到图像文件.有可能通过CSS做我想做的事吗?

css java user-interface styles javafx-2

5
推荐指数
1
解决办法
3513
查看次数

JavaFX 2调试css

在使用JavaFX时,我正在努力处理一些CSS样式.

我想知道是否有任何方法来调试CSS?

像firebug或chrome中的内置工具一样,当你按下一个css样式适用于它的元素时会显示你.

css java debugging javafx styling

5
推荐指数
2
解决办法
3211
查看次数

TypeScript 推荐的带有模块的项目结构

我是一个 TypeScript 初学者,但我有 Java 开发经验,我想知道用 TypeScript 编写的推荐文件结构是什么 - 特别是在涉及模块时。

比方说,我有几个模块:ui.dashboardui.modelsutil.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 不可见。

推荐的工作方式是什么?

typescript

5
推荐指数
1
解决办法
3472
查看次数

Java:从静态方法获取被调用的类名

我有两个类定义如下:

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()将返回AB.getName()返回B

谢谢.

java reflection

4
推荐指数
1
解决办法
4747
查看次数

Eclipse - 注解处理器,获取项目路径

我正在为 Eclipse 构建一个注释处理器插件,我想做的是在处理过程中检查项目文件夹内的几个文件。

我想知道如何从我的处理器中获取项目路径。我相信这是可以完成的,因为项目源路径已提供给处理器 - 但我找不到到达它的方法。

我尝试查看 System.properties 和processingEnv.getOptions(),但那里没有有用的信息。

最终我也想在 Netbeans 上使用这个注释处理器,所以如果有一个公共 API 可以提供这些信息,那将是最好的 - 但任何帮助将不胜感激。

java eclipse eclipse-plugin annotation-processing

3
推荐指数
2
解决办法
3753
查看次数