编程语言
首页 > 编程语言> > 使用Java未来进行无限操作是错误的吗?

使用Java未来进行无限操作是错误的吗?

作者:互联网

我需要在Clojure程序中实现无限操作.我希望Java程序员的语法也相当清晰:

(defn- my-operation
    (future
        (while @continue
            (do things)
            (Thread/sleep polling-time)))

这给了我我想要的东西,在不同的线程中的操作,因此它不会阻止主要的,并且还有一个非常清晰和直接的语法,而不必处理将迫使我使用点特殊形式的本机Java函数.

但Java未来的定义是“异步计算结果的表示”,在这种情况下,我实际上并没有对结果做任何事情.

>以这种方式使用它们是错误的吗?
>与开始我自己的线程相比,是否有任何技术差异应该让我担心?
>这在语义上是错误的吗?

解决方法:

这将占用Clojure管理的线程池中的一个线程,并用于此类事情.该线程池的预期用途是用于短期运行操作,因此它是一种误用.此外,未来背后的意图是计算一次值,以便可以多次解除引用,这样也是一种误用.

对于长时间运行的任务,还有许多其他选项,包括使用Java的Executor框架,核心异步或启动自己的线程.

(defonce background-thread (doto (Thread. (fn []
                                            (while @continue
                                              (do things)
                                              (Thread/sleep polling-time))))
                             (.setDaemon true)
                             (.start)))

正如其他人所提到的,可能值得考虑未处理的异常. Stuart Sierra的博文是great place to start.

未来的文档字符串表示它返回了一些你可以调用deref的东西.它是一个引用类型,就像延迟或原子一样,它有自己的语义,它是如何得到一个值的,而它是真的,你可以创建一个未来,让它永远运行,如果你看到一些代码的未来,它意味着你关心它产生的价值.

(clojure.repl/doc future)
-------------------------
clojure.core/future
([& body])
Macro
  Takes a body of expressions and yields a future object that will
  invoke the body in another thread, and will cache the result and
  return it on all subsequent calls to deref/@. If the computation has
  not yet finished, calls to deref/@ will block, unless the variant of
  deref with timeout is used. See also - realized?.

标签:java,multithreading,clojure,future,java-util-concurrent
来源: https://codeday.me/bug/20190727/1550297.html