在ExecutorService中隐藏一个线程(Java / Clojure)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在ExecutorService中隐藏一个线程(Java / Clojure),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1764字,纯文字阅读大概需要3分钟。
内容图文
![在ExecutorService中隐藏一个线程(Java / Clojure)](/upload/InfoBanner/zyjiaocheng/826/30db7bd53cbd4b4ab5e0fd3075655462.jpg)
我在clojure程序中创建了相当多的线程:
(import '(java.util.concurrent Executors))
(def *pool*
(Executors/newCachedThreadPool))
(defn do-something []
; work
Thread/sleep 200
; repeat)
(dotimes [i 10000]
(.submit *pool* do-something))
对我来说,JVM之间已经有一段时间了,我基本上在想这里是否有任何反对在Executor正在执行的函数内使用sleep或yield的论据?如果我理解正确,在这种情况下,我的每个工人都有自己的线程,因此不应该有任何副作用.
如果Executor使用的是FixedThreadPool:
(Executors/newFixedThreadPool 1000)
事情变得更加复杂,因为线程在工作完成之前不会返回池中,这意味着如果线程处于休眠状态,其他排队的工作人员将需要更长的时间来完成.
我对这种情况下的线程理解是否正确?
(注意:我怀疑我的设计确实是错误的,但只是想确保我在正确的页面上)
解决方法:
执行程序在概念上是工作池的任务队列.你对这里发生的事情的解释基本上是正确的.向执行程序提交任务时,工作将排队,直到线程可以执行任务.当它执行任务时,该任务拥有该线程并且休眠将阻止在该工作线程上执行其他任务.
取决于你正在做什么,这可能是好的(尽管在任务中睡觉是不寻常的,可能是糟糕的形式).阻塞线程作为等待IO的副作用(例如在套接字或数据库调用上被阻塞)更为常见.
通常,如果您正在进行定期工作,最好在池外处理它们并在执行它们时触发任务,或者更好的是,使用ScheduledExecutorService而不是Executors / newScheduledThreadPool.
Java中用于执行基于时间的任务的另一个主要机制是java.util.Timer,它更容易使用,但不如ScheduledExecutorService强大.
来自Clojure的另一个替代方法是将worker明确地放入由Clojure管理的后台线程中,而不是由您:
(defn do-task []
(println (java.util.Date.) "doing task"))
(defn worker [f n wait]
(doseq [task (repeat n f)]
(f)
(Thread/sleep wait)))
;; use future to execute worker in a background thread managed by Clojure
(future (worker do-task 10 1000))
;; the call to future returns immediately but in the background console
;; you will see the tasks being run.
内容总结
以上是互联网集市为您收集整理的在ExecutorService中隐藏一个线程(Java / Clojure)全部内容,希望文章能够帮你解决在ExecutorService中隐藏一个线程(Java / Clojure)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。