Tag: 并发

基准测试:同一过程多次,只有一次预热?

我目前正在开发一个Java应用程序(Benchmark),其目的是确定某些与数据库相关的进程。 我的应用程序应运行如下: 我有多个Usecases(简单插入,简单更新等,在数据库中),我想多次运行。 运行之间的唯一区别是同时运行的线程数。 我需要使用1,2,4,8,16等线程对这些用例进行测试,以便在我的测试中包含并发性(使用ExecutorService)。 我的问题 : 我的应用程序在每次运行之前是否需要运行预热? 或者只有一个就足够了。 换句话说,我的应用程序是否必须执行以下操作: –warmup –process(1) (1 thread) –warmup –process(2) (2 threads) etc. 要么 –warmup –process(1) –process(2) etc. 基本上,无论线程数如何,“process()”方法都完全相同。 我倾向于认为一个显然是足够的,因为JVM不会真正优化任何东西,因为代码不会改变。 但是,仍然,我更喜欢寻求一些exerimented建议:) 谢谢您的帮助 ! 注意:我读了很多关于基准测试的内容: http://www.ibm.com/developerworks/library/j-jtp12214/ http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html http://www.ibm.com/developerworks/java/library/j-benchmark2/ 这就是为什么我会说只需要一次预热。 🙂

Grails – 与第三方API的异步通信

我正在尝试使用grails来与在线交易平台进行交互。 特别是盈透证券(IB) http://interactivebrokers.com/en/p.php?f=programInterface&ib_entity=llc API的工作方式是你需要运行他们的客户端程序,Trader Workstation(TWS http://interactivebrokers.com/en/p.php?f=tws&ib_entity=llc )然后我们使用API​​来做东西。 使用API​​基本上涉及创建“代理”对象,调用connect()成员函数(这使得与TWS软件的本地端口连接)并调用类似getData()的东西 此方案中的Grails值是GORMfunction和提供的Web框架。 我希望能够定义从db实现中抽象出来的对象,轻松执行持久性操作,并轻松地为用户提供用于执行CRUD和自定义操作的UI。 我的挑战是IB API对请求和回复使用异步通信。 即,当我调用getData()时,API知道在准备发送它们时使用回调函数dataResults()。 为了使dataResults()可以调用,我创建的代理对象仍然需要四处接收回复。 在控制器函数内部,如果我创建一个代理对象并调用getData(),当请求完成时,代理对象显然也会消失。 所以我永远无法收到回复。 我认为可能有一些方法可以通过开始后台线程来做到这一点,但我不确定这是我想要的路径。 有没有人对最佳方法有什么建议? 我没有和grails结婚,我使用它的原因就在上面。 如果有一个桌面应用程序框架,我也可以在以后轻松创建一个Web界面,我肯定对此持开放态度。 提前致谢。

在Java中向线程池中添加新任务之前等待任务完成的最佳方法?

我想使用类似ThreadPoolExecutor的东西来管理在可用线程上运行一堆任务。 这些任务都是相同的类型,但处理不同的帐户。 这些帐户的新任务可以定期添加,我希望它能够检查并且不允许新任务开始,直到同一帐户的旧任务已经完成。 最好的方法是什么? 例 帐户“234”的任务已启动(通过ThreadPoolExecutor.execute()) 帐户“238”的任务已启动(通过ThreadPoolExecutor.execute()) 帐户“234”的新任务已创建但未添加执行,因为第一个“234”任务未完成(检查此问题的最佳方法是什么?) 帐户“238”的任务完成 帐户“238”的新任务启动(通过ThreadPoolExecutor.execute()),因为当前没有为该帐户运行 最好的方法是什么? 只需要在等待/睡眠()中检查Runnable中的某些检查变量,以便完成“234”的第一个任务吗? 或者有更好的解决方案吗?

如何在超时后取消任务?

我有一些Task执行可以挂起的I / O阻塞操作(从URL获取文件) task = new Task<List>() { @Override protected List call() { List services = new ArrayList(); try { services = WSDLService.createService(wsdlURL).getOperations(); } catch (Exception ex) { LOG.log(Level.WARNING, “Can’t reach {0}”, wsdlURL); } return services; } }; } createService方法可以永远等待而不会抛出任何Exception 。 (我使用Main类中定义的全局( static public ) ExecutorService执行任务)。

将线程实现到Java Web Crawler中

这是我写的原始网络爬虫:(仅供参考) https://github.com/domshahbazi/java-webcrawler/tree/master 这是一个简单的网络爬虫,它访问给定的初始网页,从页面中删除所有链接并将它们添加到队列(LinkedList),然后逐个弹出它们,每次访问,循环再次开始。 为了加速我的程序和学习,我尝试使用线程实现,这样我就可以同时运行多个线程,在更短的时间内索引更多的页面。 以下是每个class级: 主要课程 public class controller { public static void main(String args[]) throws InterruptedException { DataStruc data = new DataStruc(“http://www.imdb.com/title/tt1045772/?ref_=nm_flmg_act_12”); Thread crawl1 = new Crawler(data); Thread crawl2 = new Crawler(data); crawl1.start(); crawl2.start(); } } 爬虫类 (线程) public class Crawler extends Thread { /** Instance of Data Structure **/ DataStruc data; /** Number […]

setPriority()方法无法正常工作

我从这里做示例代码。 我得到了结果: Thread[Thread-3,1,main]: 5 Thread[Thread-0,10,main]: 5 Thread[Thread-2,1,main]: 5 Thread[Thread-1,1,main]: 5 Thread[Thread-4,1,main]: 5 Thread[Thread-0,10,main]: 4 Thread[Thread-3,1,main]: 4 Thread[Thread-2,1,main]: 4 Thread[Thread-0,10,main]: 3 Thread[Thread-5,1,main]: 5 Thread[Thread-3,1,main]: 3 Thread[Thread-2,1,main]: 3 Thread[Thread-1,1,main]: 4 Thread[Thread-5,1,main]: 4 Thread[Thread-3,1,main]: 2 Thread[Thread-2,1,main]: 2 Thread[Thread-5,1,main]: 3 Thread[Thread-3,1,main]: 1 Thread[Thread-4,1,main]: 4 Thread[Thread-0,10,main]: 2 Thread[Thread-2,1,main]: 1 Thread[Thread-5,1,main]: 2 Thread[Thread-4,1,main]: 3 Thread[Thread-5,1,main]: 1 Thread[Thread-1,1,main]: 3 Thread[Thread-0,10,main]: 1 Thread[Thread-4,1,main]: […]

线程安全LinkedHashMap没有Collections.synchronized

我正在使用LinkedHashMap,并且环境是multithreading的,因此这个结构需要是线程安全的。 在特定事件期间,我需要读取整个地图推送到数据库并清除所有。 大多数时候只有写入发生在这张地图上。 此地图限制了50个条目。 我使用的是Oracle MAF,它没有Collections.syncronizedMap。 那么,我需要在synchronized块中放置什么东西以确保写入和读取不会遇到concurrentModificationException等 几个要求: 我需要像循环队列一样表现它,以便重写LinkedHashMap的removeEldestEntry方法。 我需要保留订单

多个线程可以使用相同CacheManager的相同Ehcache对象吗?

我创建了一个Cache对象,它将String作为键存储,并将序列化对象存储为值。 Cache(String—>Object) 我试图运行三个Akka线程,以同步的方式检索和写入相同的Ehcache对象。 Thread 1- synchronized (LockForEhcache){ serializedObj = cachename.get(“key”); //— this returns an Object } //modify the serializedObj here…. //Again store the modify Object in the Cache synchronized (LockForEhcache){ cachename.clear(); cachename.put(“key”,serializedObj); Thread 2- synchronized (LockForEhcache){ serializedObj = cachename.get(“key”); //— this returns null } Thread 3- synchronized (LockForEhcache){ serializedObj = cachename.get(“key”); //— this returns null […]

并发程序降级的性能随着线程的增加而增加?

我一直在尝试在四核计算机上实现以下代码,并且Executor服务中100多次迭代中没有线程的平均运行时间如下 1个线程= 78404.95 2个主题= 174995.14 4个线程= 144230.23 但根据我所研究的, 2*(no of cores)线程应该为程序提供最佳结果,这在我的程序中显然不是这样,奇怪地给出了单线程的最佳时间。 代码: import java.util.Collections; import java.util.Random; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestHashSet { public static void main(String argv[]){ Set S = Collections.newSetFromMap(new ConcurrentHashMap()); S.add(1); S.add(2); S.add(3); S.add(4); S.add(5); long startTime = System.nanoTime(); ExecutorService executor = Executors.newFixedThreadPool(8); int Nb […]

Xlet开发中可能出现的并发问题

我参与了使用Java 1.4 API开发Xlet 。 文档说Xlet接口方法(实际上是xlet生命周期方法)是在其特殊线程(而不是EDT线程)上调用的。 我通过记录检查 – 这是真的。 这对我来说有点令人惊讶,因为它与在EDT上调用生命周期方法的BB / Android框架不同,但到目前为止它还可以。 在项目代码中,我看到应用程序广泛使用Display.getInstance().callSerially(Runnable task)调用(这是在EDT线程上运行Runnable的LWUIT方式)。 所以基本上Xlet实现类中的一些代码片段对来自EDT线程的xlet内部状态对象进行创建/更新/读取操作,而其他一些代码片段来自生命周期线程而没有任何同步(包括那些状态变量不是声明为volatile)。 Smth是这样的: class MyXlet implements Xlet { Map state = new HashMap(); public void initXlet(XletContext context) throws XletStateChangeException { state.put(“foo”, “bar”); // does not run on the EDT thread Display.getInstance().callSerially(new Runnable() { public void run() { // runs on the EDT thread […]