Tag: multithreading

非multithreading程序中的java.util.ConcurrentModificationException

嘿SO Guru我的这个代码有一份工作 public void kill(double GrowthRate, int Death) { int before = population.size(); for (PopulationMember p : population) { int[] probs = ProbablityArrayDeath(GrowthRate,Death,(int)p.fitness()); if (probs[RandomNumberGen.nextRandomInt(0, 99)]==0) { population.remove(p); } } System.out.println(“Intial Population: “+before+”, Deaths:”+(before- population.size())+”, New Population: “+population.size()); } 当我第一次尝试运行代码时运行我的程序时,它会遇到此错误 Exception in thread “main” java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) at java.util.HashMap$KeyIterator.next(HashMap.java:828) at Genetics.Population.kill(Population.java:181) at Genetics.Population.run(Population.java:47) at Control.Main.main(Main.java:35) […]

关于在对象的构造函数完成之前对对象的引用

你们每个人都知道JMM的这个特性,有时候对象的引用可以在这个对象的构造函数完成之前获得值。 在JLS7中,p。 17.5 最后的字段语义我们也可以阅读: final字段的用法模型很简单:在该对象的构造函数中设置对象的final字段; 并且在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用 。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的final字段的正确构造版本。 (1) 在JLS之后,接下来的例子展示了如何不保证非最终字段的初始化(1例17.5-1.1) (2) : class FinalFieldExample { final int x; int y; static FinalFieldExample f; public FinalFieldExample() { x = 3; y = 4; } static void writer() { f = new FinalFieldExample(); } static void reader() { if (f != null) { int i = fx; […]

灵活的CountDownLatch?

我现在遇到了两次问题,即生产者线程生成N个工作项,将它们提交给ExecutorService ,然后需要等到所有N个项都被处理完毕。 注意事项 N事先不知道 。 如果是这样的话,我只需创建一个CountDownLatch ,然后让生产者线程await()直到所有工作完成。 使用CompletionService是不合适的,因为尽管我的生产者线程需要阻塞(即通过调用take() ),但没有办法表明所有工作都已完成 ,导致生产者线程停止等待。 我目前最喜欢的解决方案是使用整数计数器,并在提交工作项时递增它,并在处理工作项时递减它。 在所有N个任务的提交之后,我的生产者线程将需要等待一个锁,检查counter == 0是否通知。 如果消费者线程已经递减计数器并且新值为0,则消费者线程将需要通知生产者。 有没有更好的方法来解决这个问题,或者java.util.concurrent是否有合适的构造我应该使用而不是“滚动自己的”? 提前致谢。

如何在Java中实现基于线程的UDP服务器?

如何在Java中实现基于线程的UDP服务器? 基本上我想要的是将多个客户端连接到服务器,并让每个客户端都有自己的线程。 唯一的问题是,我不知道如何检查客户端是否正在尝试连接到服务器并为其生成新线程。 boolean listening = true; System.out.println(“Server started.”); while (listening) new ServerThread().start(); 在这种情况下,服务器将生成新线程,直到内存不足。 这是ServerThread的代码(我想我需要一种机制,在客户端尝试连接之前停止创建ServerThread。 public ServerThread(String name) throws IOException { super(name); socket = new DatagramSocket(); } 所以Java编程的父亲请帮忙。

具有限制/吞吐量控制的Java Executor

我正在寻找一个Java Executor,它允许我指定限制/吞吐量/起搏限制,例如,不超过100个任务可以在一秒钟内处理 – 如果更多的任务被提交,他们应该排队并稍后执行。 这样做的主要目的是避免在访问外部API或服务器时遇到限制。 我想知道基础Java(我怀疑,因为我检查过)或其他可靠的地方(例如Apache Commons)是否提供了这个,或者我是否必须编写自己的。 最好是轻量级的。 我不介意自己写,但如果某个地方有“标准”版本,我至少要先看一下。

Javamultithreading文件下载性能

最近我在一个需要比以前更多的IO交互的项目上工作,我觉得我想要查看常规库(特别是Commons IO)并解决更深入的IO问题。 作为一项学术测试,我决定实现一个基本的,multithreading的HTTP下载器。 这个想法很简单:提供一个下载URL,代码将下载该文件。 为了提高下载速度,将文件分块并同时下载每个块(使用HTTP Range: bytes=xx标头)以尽可能多地使用带宽。 我有一个工作原型,但你可能已经猜到了,它并不完全理想。 目前我手动启动3个“下载程序”线程,每个线程下载文件的1/3。 这些线程使用通用的同步“文件编写器”实例来实际将文件写入磁盘。 完成所有线程后,“文件编写器”完成,任何打开的流都关闭。 一些代码片段可以给你一个想法: 线程启动: ExecutorService downloadExecutor = Executors.newFixedThreadPool(3); … downloadExecutor.execute(new Downloader(fileWriter, download, start1, end1)); downloadExecutor.execute(new Downloader(fileWriter, download, start2, end2)); downloadExecutor.execute(new Downloader(fileWriter, download, start3, end3)); 每个“下载程序”线程下载一个块(缓冲)并使用“文件编写器”写入磁盘: int bytesRead = 0; byte[] buffer = new byte[1024*1024]; InputStream inStream = entity.getContent(); long seekOffset = chunkStart; while ((bytesRead = inStream.read(buffer)) […]

每个连接的线程数与每个请求的线程数有什么区别?

能否解释一下在各种servlet实现中实现的两种方法: 每个连接的线程 每个请求的线程 以上两种策略中哪一种更好地扩展?为什么?

JavaFX:在单独的线程中运行任务不允许运行任何其他任务

我需要在我的程序中不断更新数据,所以我认为通过使用JavaFX的Task,我可以让它在我的程序中作为一个单独的进程运行。 final Task task = new Task() { @Override protected Void call() throws Exception { Platform.runLater(() -> { while (true) { itemData.forEach(data -> { System.out.println(data.getId()); }); } }); return null; } }; Thread thread = new Thread(task); thread.setDaemon(true); thread.start(); 这是在Initializable接口提供的initialize方法中声明的。 但是,在运行此程序时,即使任务在单独的线程上运行,任务也是唯一运行的。 为什么会这样做而不是像预期的那样运行?

服务时间与线程数成正比

我的系统是带有超线程的i5-Dual核心。 Windows向我展示了4个处理器。 当我一次由单个线程运行单个优化的cpu绑定任务时,其服务时间始终显示为35ms。 但是,当我将2个任务同时切换到2个线程时,他们的服务时间显示为70毫秒。 我想问我的系统有4个处理器,那么为什么在2个线程运行teir任务的情况下服务时间是70,而2个线程应该在2个处理器上运行而没有任何调度开销。代码如下。 CPU绑定任务如下。 import java.math.BigInteger; public class CpuBoundJob implements Runnable { public void run() { BigInteger factValue = BigInteger.ONE; long t1=System.nanoTime(); for ( int i = 2; i <= 2000; i++){ factValue = factValue.multiply(BigInteger.valueOf(i)); } long t2=System.nanoTime(); System.out.println("Service Time(ms)="+((double)(t2-t1)/1000000)); } } 运行任务的线程如下。 public class TaskRunner extends Thread { CpuBoundJob job=new CpuBoundJob(); public […]

HttpSession中的同步是否可行?

更新:解决方案后问题。 题: 通常,同步是在JVM内串行化并行请求,例如 private static final Object LOCK = new Object(); public void doSomething() { … synchronized(LOCK) { … } … } 在查看Web应用程序时,“JVM全局”范围上的某些同步可能会成为性能瓶颈,仅在用户的HttpSession范围内进行同步会更有意义。 以下代码是否可能? 我怀疑同步会话对象是一个好主意,但听到你的想法会很有趣。 HttpSession session = getHttpServletRequest().getSession(); synchronized (session) { … } 关键问题: 是否保证会话对象是处理来自同一用户的请求的所有线程的相同实例 ? 总结答案/解决方案: 看来会话对象本身并不总是相同,它依赖于servlet容器(Tomcat,Glassfish,…)的实现,而getSession()方法可能只返回一个包装器实例。 因此,建议使用存储在会话中的自定义变量作为锁定对象。 这是我的代码提案,欢迎提供反馈: 帮手类中的某个地方,例如MyHelper : private static final Object LOCK = new Object(); public static Object getSessionLock(HttpServletRequest […]