我一直听说有关添加到JVM的所有新酷功能,其中一个很酷的功能是invokedynamic.我想知道它是什么以及它如何使Java中的反射编程更容易或更好?
我有一个抽象类,它有一个泛型方法,我想通过用特定类型替换泛型参数来覆盖泛型方法.所以在伪代码中我有以下内容:
public abstract class GetAndParse {
public SomeClass var;
public abstract <T extends AnotherClass> void getAndParse(T... args);
}
public class Implementor extends GetAndParse {
// some field declarations
// some method declarations
@Override
public <SpecificClass> void getAndParse(SpecificClass... args) {
// method body making use of args
}
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,我不允许这样做?我是在做某种语法错误还是这种继承和覆盖是不允许的?具体来说,我收到一个错误,@Override因为eclipse IDE一直在提醒我实现getAndParse.
以下是我希望上述代码的工作方式.我的代码中的其他地方有一个方法,它需要实现的对象实例,GetAndParse这意味着它们有一个getAndParse我可以使用的方法.当我调用getAndParse该实例时,编译器会检查我是否T以正确的方式使用了特定的实例,因此特别T应该扩展AnotherClass它应该是SpecificClass.
我有一个可以分成独立单元的计算,现在我正在处理的方法是创建一个固定数量的线程,然后在每个线程中分发要完成的工作块.所以在伪代码中这就是它的样子
# main thread
work_units.take(10).each {|work_unit| spawn_thread_for work_unit}
def spawn_thread_for(work)
Thread.new do
do_some work
more_work = work_units.pop
spawn_thread_for more_work unless more_work.nil?
end
end
Run Code Online (Sandbox Code Playgroud)
基本上,一旦创建了初始线程数,每个线程都会完成一些工作,然后继续从工作堆中完成工作,直到没有剩下任何东西.当我在irb中运行时,一切正常,但是当我使用解释器执行脚本时,事情并没有那么好用.我不确定如何使主线程等到所有工作完成.有没有一种很好的方法可以做到这一点,或者我坚持sleep 10 until work_units.empty?在主线程中执行
ruby中的元编程非常棒,因为我经常使用它来模拟基于原型的编程,并快速编写原型解决方案来解决某些问题,以测试它们的可行性.所以我想知道以下代码之间是否存在任何本质区别:
(class << some_object; self; end).class_eval do
define_method(:method_name) do ... method body ... end
end
Run Code Online (Sandbox Code Playgroud)
和
(class << some_object; self; end).instance_eval do
define_method(:method_name) do ... method body ... end
end
Run Code Online (Sandbox Code Playgroud)
代码的两个版本定义一个单身方法,我还没有碰到任何东西,迫使我选择(instance_eval, define_method)在组合(class_eval, define_method)组合来定义一个单独的方法,我想知道是否有这两个之间有一些本质上的区别.
我尝试用不熟悉的编程语言学习的第一件事就是它如何处理闭包.它们的语义通常与语言如何处理范围和各种其他棘手的部分交织在一起,因此理解它们会揭示该语言的其他几个方面.此外,闭合是一个非常强大的构造,并且通常会减少我必须键入的样板量.所以我正在搞乱perl闭包,我偶然发现了一个小问题:
my @closures;
foreach (1..3) {
# create some closures
push @closures, sub { say "I will remember $_"; };
}
foreach (@closures) {
# call the closures to see what they remember
# the result is not obvious
&{$_}();
}
Run Code Online (Sandbox Code Playgroud)
当我编写上述代码时,我期待看到
I will remember 1
I will remember 2
I will remember 3
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了I will remember CODE(0x986c1f0).
上面的实验揭示了它$_是非常依赖于上下文的,如果它出现在一个闭包中,那么它的值不会在闭包创建时固定.它的行为更像是一个参考.在perl中创建闭包时,我应该注意哪些其他问题?
是否可以从自己的体内重新定义JavaScript函数.例如,我可以执行以下操作吗?
function never_called_again(args) {
// Do some stuff
never_called_again = function (new_args) {
// Do some new stuff
}
}
Run Code Online (Sandbox Code Playgroud)
以上是否有效且是否具有正确的语义?我不想用旧的函数名创建一个新的全局变量,因为我试图在全局范围内做这种事情,但是从各种对象范围开始,我不希望当我发生名字冲突时在这些本地范围内重新定义函数.
一段时间以来,我一直围绕没有副作用的方法构建我的代码,以便使用并行linq来加快速度.一路走来,我不止一次偶然发现懒惰的评估让事情变得更糟而不是更好,我想知道是否有任何工具可以帮助优化并行linq查询.
我问,因为我最近通过修改某些方法并AsParallel在某些关键位置加油来重构一些令人尴尬的并行代码.运行时间从2分钟下降到45秒,但从性能监视器可以清楚地看出,有些地方CPU上的所有内核都没有得到充分利用.在一些错误的启动后,我强制执行一些查询,ToArray并且运行时间进一步降低到16秒.减少代码的运行时间感觉很好,但它也有点令人不安,因为不清楚需要强制使用代码查询的位置ToArray.等到查询执行的最后一分钟不是最佳策略,但是根本不清楚代码中的哪些点需要强制某些子查询才能利用所有CPU内核.
因为它是我不知道如何正确胡椒ToArray或其他方法迫使linq计算执行,以获得最大的CPU利用率.那么优化并行linq查询是否有任何通用指南和工具?
这是一个伪代码示例:
var firstQuery = someDictionary.SelectMany(FirstTransformation);
var secondQuery = firstQuery.Select(SecondTransformation);
var thirdQuery = secondQuery.Select(ThirdTransformation).Where(SomeConditionCheck);
var finalQuery = thirdQuery.Select(FinalTransformation).Where(x => x != null);
Run Code Online (Sandbox Code Playgroud)
FirstTransformation,SecondTransformation,ThirdTransformation都是CPU绑定,并且在复杂性方面,他们有几个3x3矩阵乘法和一些if分支机构.SomeConditionCheck几乎是一张null支票.FinalTransformation是代码中CPU密集度最高的部分,因为它将执行一大堆线平面交叉,并检查这些交叉点的多边形包含,然后提取最接近线上某个点的交点.
我不知道为什么我放置的地方AsParallel减少了代码的运行时间.我现在已经达到了运行时间的局部最小值,但我不知道为什么.我偶然发现它只是运气不好.如果你想知道放置的地方AsParallel是第一行和最后一行.放在AsParallel其他地方只会增加运行时间,有时甚至会增加20秒.ToArray第一行还有隐藏的藏身之处.
我一直在学习scala,我得说它是一种非常酷的语言.我特别喜欢它的模式匹配功能和函数文字,但我来自javascript,ruby背景,这些语言中我最喜欢的模式之一是惰性函数和方法定义模式.javascript中的一个例子是
var foo = function() {
var t = new Date();
foo = function() {
return t;
};
return foo();
};
Run Code Online (Sandbox Code Playgroud)
带有小调整的相同代码在ruby中工作,您只需使用单例对象在执行计算后重新定义该方法.当涉及昂贵的计算时,这种事情非常方便,如果您需要结果,则提前不知道.我知道在scala中我可以使用缓存来模拟相同类型的结果,但我正在尝试避免条件检查,到目前为止,我的实验已经返回了负面结果.有没有人知道scala中是否存在惰性函数或方法定义模式?
注意:javascript代码来自Peter Michaux的网站.
design-patterns scala lazy-loading lazy-evaluation lazy-initialization
我一直在使用PsExec -d远程PowerShell会话中启动控制台应用程序,因为我希望这些应用程序在执行某些任务时在后台运行.问题是我希望后台应用程序继续运行,即使我杀死远程PowerShell会话Remove-PSSession.当前发生的事情是远程PowerShell会话被杀死所以所有进程都是在帮助下启动的PsExec -d.我猜它与进程树有关,以及windows如何管理这些事情的生命周期.
有没有人知道如何启动远程后台进程并且即使在远程会话被杀死后该进程仍然存在?
假设我正在synchronized某个线程内执行一个代码块,并且在synchronized块内我调用一个方法,该方法产生另一个线程来处理需要与第一个方法相同锁定的同步代码块.所以在伪Java代码中:
public void someMethod() {
synchronized(lock_obj) {
// a whole bunch of stuff...
// this is the last statement in the block
(new Thread(someOtherMethod())).start();
}
// some more code that doesn't require a lock
}
public void someOtherMethod() {
// some setup code that doesn't require a lock
// return the stuff we want to run in another thread
// that does require a lock
return new Runnable() {
@Override
public void run() {
synchronized(lock_obj) { …Run Code Online (Sandbox Code Playgroud) java ×3
ruby ×2
c# ×1
c#-4.0 ×1
closures ×1
concurrency ×1
deadlock ×1
inheritance ×1
javascript ×1
lazy-loading ×1
linq ×1
overriding ×1
perl ×1
plinq ×1
powershell ×1
psexec ×1
reflection ×1
scala ×1
synchronized ×1
threadpool ×1