我在Java线程方面有一些经验,但我想知道…
存储多个线程的最佳实践是什么,我可以在其中单独或成组访问这些线程?
我自己的解决方案是创建一个threadArray
类,但是自然地,我希望使用更可靠的本机类。
提前致谢!
编辑
显然,功能对于最佳方法非常重要。好吧,我举一个例子:
我有一个基本上可以同时搜索大量信息的应用程序,因此我正在使用线程。但是,每个线程仅需要执行整个操作的一部分,因此我希望添加其他参数来指定范围。
当一个线程完成它的特定搜索时,它自然就会停止。但是,当线程找到结果时,我希望停止所有线程并检索该结果。
有帮助吗?
我会使用an ExecutorService
来将我的线程作为一个池来管理Future
,并Threads
以某种形式将我添加到池中时得到的s
放入Collection
。
通过这种方式,您可以通过执行器将所有线程作为一个单元进行管理,并通过其线程跟踪各个线程Future
。
根据您的要求进行编辑
您可以使用的shutdownNow
方法ExecutorService
来中止所有正在运行的线程。
示例(不是解决问题的方法,但涵盖了使用执行程序的大多数好处):
// Thread pool for the collectors.
ExecutorService threads = Executors.newFixedThreadPool(MAX_THREADS);
...
// Futures of all collectors running in the pool.
ConcurrentLinkedQueue<Future> collectors = new ConcurrentLinkedQueue<Future>();
...
// Make my Callable.
Callable<Void> c = new FileListCollector(path, recurse, filter);
// Start it up and keep track of it so we can find out when it has finished.
collectors.add(threads.submit(c));
...
// Called when nothing in queue.
private void checkForFinished() {
// Count the running threads.
int runningThreads = 0;
try {
// Track dead ones to remove.
List<Future> deadThreads = new LinkedList<Future>();
// Walk all collectors.
for (Future f : collectors) {
// I've seen f being null once. No idea how.
if (f != null) {
// If it's not done then it's running.
if (!f.isDone()) {
// Count it.
runningThreads += 1;
} else {
// Mark for deletion.
deadThreads.add(f);
}
}
}
// Clear dead threads - just to be tidy.
collectors.removeAll(deadThreads);
} catch (ConcurrentModificationException cme) {
// Probably a new thread has been started while I was checking!
// Therefore almost certainly NOT all finished.
runningThreads += 1;
}
// If no threads are left, we're done.
if (runningThreads == 0) {
// Finished! Close everything down.
close();
}
}
// Close down the whole system.
public void close() {
// Use the fileQueue state to indicate closed.
if (!fileQueue.isClosed()) {
// Close the queue ... unblocking all collectors (I hope).
fileQueue.close();
// Shut them down agressively as this may be called by user prematurely as well as by me.
threads.shutdownNow();
// Wait until all is done.
boolean terminated = false;
do {
try {
// Wait up to 1 second for termination.
terminated = threads.awaitTermination(1, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
// Ignore the interrupt! If I exit here we will probably leak.
}
} while (!terminated);
log("! All done");
}
}
我基本上有一个对象,它存储了一个项目的3D位置和其他属性,如速度。该位置每隔100毫秒由一个单独的威胁计算一次。另一种威胁访问这些属性并修改其中的一些属性。 我的第一个想法是简单地对每个属性使用,但据我所知,对volatile属性的每个操作都必须是原子的。由于这两种威胁都允许在某些情况下改变某些属性(如速度),这似乎不起作用。 我的下一个想法是使用Java的关键字,同步每个getter和sette
这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们
处理后台任务与常规调用方法有很大的不同。本指南旨在帮助让您的后台任务平稳有效地运行。本文基于 这篇博客文章。 使任务参数小而简单 方法(任务)在调用之前会被序列化。使用 TypeConverter 类将参数转换为 JSON 字符串。如果您有复杂的实体和 / 或大对象; 包括数组,最好将它们放入数据库,然后只将其标识 (id) 传递给后台任务。 错误例子: public void Method(En
VR设计 VR设计不同于平面体验设计。作为一种新的媒介,有新的最佳实践需要遵循,特别是保持用户的舒适性和存在性。这在如下指南中已经写得很透彻了: Oculus VR最佳实践 Leap Motion VR最佳实践指南 一些值得注意的事情: 公共的金科玉律是永远不要意外地把相机控制权从用户手中剥夺。 单位(比如对于位置)应该考虑使用米(m)。这是因为WebVR API以米为单位返回姿势数据,进而传送给
本章文档将阐述一些使用herosphp开发一些常用模块的一些比较好的实践。 未完待续。。。
适当的使用vuex 能不用就不用。 能用就用。 不要为了使用而使用,一个小方法里面有5个设计模式。 不要过度使用CSS框架 因为CSS框架一般会大幅度增加文件体积。 例如 bootstrap, ele.me前端框架。 这个在低端安卓机上影响显著。 使用CDN来存放js, css, 和图片文件。 灵活使用第三方Vue 插件 例如: 轮播图, 表单验证等等。这些轮子都是现成的。 前端逻辑务必简单 能在