我读过akka文档,在使用akka时无法清楚地理解线程交互.文档可能会忽略这个事情,但对我来说并不是那么明显.
所有的akka演员似乎都被称为同一个线程.我将actor视为共同程序,每次收到调用时都有自己的堆栈重置.
你可以执行一系列直线切换的演员链.每个接收执行小的非阻塞操作并强制另一个接收进一步工作.没有事件循环,可以处理actor系统之外的消息.
我想从其他线程捕获请求,执行控制操作,并等待另一条消息.
有一些用例概述了我的需求.
有一些线程不断地从某些来源轮询数据.一旦数据匹配模式,它就会根据actor调用事件驱动的处理程序.逻辑控制器做出决定并将其传递给工人.应该有两个持久的线程.一个线程在轮询上不断工作,另一个线程以异步方式工作以控制它的工作.你不应该让akka actor第一个线程,因为它们打破了轮询周期,第一个线程不应该阻止actor,所以他们需要另一个线程.
有一种双面棋盘游戏.一方有一个控制器线程,用于安排计算时间与板服务器和其他工作交互.其他线程是一个繁重的计算线程,它循环不同的变体,因为它具有阻塞性,所以无法用akka编写
我知道现有的akka期货,但它们代表了一个工作任务,一旦被解雇并在执行目标后关闭.期货与akka演员很好地结合在一起,但无法表达循环的工作线程.
Akka actor系统包含不同类型的网络事件循环.您可以使用其内置的远程actor系统或众所周知的0mq协议.但是使用网络进行线程交互似乎对我来说太过分了.
将非akka线程与akka一起粘贴的假设方法是什么?我应该编写几个特殊的过程来以线程安全的方式执行消息传递吗?
直接类型递归正常工作:
trait TT[T<:TT[T]]
Run Code Online (Sandbox Code Playgroud)
但我可以用天真的方法做出间接的
trait UU[V <: VV[UU[V]]]
trait VV[U <: UU[VV[U]]]
Run Code Online (Sandbox Code Playgroud)
给我错误:
CyclicTraits.scala:23: error: type arguments [UU[V]] do not conform to
trait VV's type parameter bounds [U <: UU[VV[U]]]
trait UU[V <: VV[UU[V]]]
^
CyclicTraits.scala:25: error: type arguments [VV[U]] do not conform to
trait UU's type parameter bounds [V <: VV[UU[V]]]
trait VV[U <: UU[VV[U]]]
^
Run Code Online (Sandbox Code Playgroud)
如何正确表达间接类型参数递归?
我想将缓冲区局部变量(特别是标记环)设置为默认值(nil).我该怎么做这个任务?是创建某个函数并将其绑定到init.el文件中的键序列的唯一选项吗?
我有一个自定义单元工厂的ListView.我在单元格minWidth上计算最大值,并将其设置为整个ListView的minWidth.因此,布局中受其他区域约束的ListView会缩小到minWidth.但它所拥有的细胞大小调整为首选宽度,而不是最小.因此,节点不适合包含视口,并显示水平滚动条.
这很讨厌.我想让每个单元格完全适合ListView,并摆脱滚动条.更确切.当ListView减小到其最小宽度时,其所有单元格也应减小到此最小宽度.
我正在寻找一些控制属性来切换单元调整大小的策略,以便在没有预定义开关的情况下实现所描述的行为.
更新:添加了图形示例
我创建了SplitPane来简化测试布局.我可以通过用鼠标移动它的分隔符来定义布局限制.
第一个镜头显示了初始问题:不遵守单元节点的实际尺寸(min,max,pref).ListView始终使用prefWidth,即使它大于视口宽度.因此,可以避免使用水平滚动.

之后,我尝试手动设置较小的首选宽度.所以细胞现在完全可见.这不是解决方案.我给出这个镜头来证明单元格具有足够小的minWidth以适应ListView.

最后一枪也是丑陋的.它留下了可能充满细胞内容的自由空间.这很自然:如果视口大于首选宽度且小于最大宽度,则应该用于调整单元格内容的大小.
可以通过切换到显式指定的静态大小的元素来抑制该问题.但这样做意味着放弃动态布局的所有好处:程序员每次使用CSS应用新外观时都必须更改大小常量,并且禁止用户调整窗口大小或使用鼠标移动分隔符.
这也是一个糟糕的解决方案.我需要什么 - 使javafx的布局引擎工作.ListView的最小宽度应该是其单元格的最小最小宽度.ListView的最大宽度应该是其单元格的最大最大宽度.ListView的首选宽度应该是其单元格的最大首选宽度.并且ListView的实际宽度应该由其父(本例中的SplitPane)设置,并且与所有三个布局边界相关.之后,这个大小应该传递给细胞.
仅当某些单元格的最小宽度太大而无法放入视口时,才应显示水平滚动条.
我得到一个奇怪的编译器错误,关于实际存在的隐式但由于某种原因无法找到.所以我构建了一个小的测试用例,可以重现神秘的行为.
trait Hide {
type T
}
object HideString extends Hide {
override type T = String
}
object HideBool extends Hide {
override type T = Boolean
}
Run Code Online (Sandbox Code Playgroud)
简单类型用作隐式转换的明确目标.
def id[H <: Hide, C](x : C)(implicit ev : C => H#T) : H#T = ev(x)
def drop[H <: Hide, C](x : C)(implicit ev : C => H#T) : Int = {
println(ev(x))
1
}
def idSeq[H <: Hide, C](x : Seq[C])(implicit ev : Seq[C] => Seq[H#T]) : Seq[H#T] = …Run Code Online (Sandbox Code Playgroud) javafx现在在oracle-jdk中.
scalafx在其存储库中提供了美味的例子
我无法回答的主要问题是"如何开始使用scalafx"?
如何在我的sbt项目中添加scalafx libary依赖项?
scala管理对象池的首选方法是什么?
我需要创建和删除单线程的大规模对象(不需要同步).在c ++中,我使用了静态对象数组.
什么是在scala中应对它的惯用和有效方法?
我有一个案例类,存储三个绑定参数.我想定义可以从任何两个参数构建类的伴随对象,看起来像下面的示例,这显然是不正确的:
def test(start : Float = end - duration, duration : Float = end - start, end : Float = start + duration) {
require( abs(start + duration - end) < epsilon )
...
}
val t1 = test(start = 0f, duration = 5f)
val t2 = test(end = 4f, duration = 3f)
val t3 = test(start = 3f, end = 5f)
Run Code Online (Sandbox Code Playgroud)
我可以用什么技巧来获得类似的用法语法?
我伪造了一个简单的例子来检查@inline注释行为:
import scala.annotation.tailrec
object InlineTest extends App {
@inline
private def corec(x : Int) : Int = rec(x - 1)
@tailrec
private def rec(x : Int) : Int =
if (x < 3) x else {
if (x % 3 == 0)
corec(x-1)
else
rec(x-4)
}
@tailrec
private def rec1(x : Int) : Int =
if (x < 3) x else {
if (x % 3 == 0) {
val arg = x - 1
rec1(arg - 1) …Run Code Online (Sandbox Code Playgroud)