Tag: concurrency

Control ExecutorService每秒最多执行N个任务

如何控制/限制提交给ExecutorService的任务? 我有SMSTask发送SMS消息,我需要控制执行程序,以便它只能发送最多N条消息/秒。

在ExecutorService上安排的守护程序线程; 解释为什么这是不好的forms

我对使用ExectuorService安排的线程有序关闭的想法很满意; 也就是说,调用shutdown或shutdownNow将导致池上创建的线程正常退出。 如果他们响应interrupt你可以确定最终会被调用等等,你将得到一个干净,可预测的退出(你可以清理任何资源等)。 但是,如果您已将线程设置为守护程序(通过执行程序的ThreadFactory ),如下所示。 ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable runnable) { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setDaemon(true); return thread; } }); 主线程终止后,VM将突然终止任何守护程序线程。 在上面的示例中,调度然后突然终止的(守护程序)线程将绕过任何finally块,并且任何可中断的方法都不会抛出InterruptedException 。 所以,我倾向于认为将ThreadPoolExecutor使用的线程标记为守护进程是不好的做法……我的问题是关于帮助我发声的原因 。 为什么在ExecutorService的线程池中使用守护程序线程是不好的做法(或者如果你不同意)? 特别是我有兴趣通过正常关闭(具有中断策略并且运行良好的线程)与守护程序线程来描述VM关闭的生命周期。 扩展最后一点,在ThreadPoolExecutor上finalize将自己调用shutdown ,但是当它使用守护进程线程时,如果VM调用了finalize ,它们可能已经终止。 那么线程池的行为是什么? 如果底层线程突然终止,它是否可以被欺骗以保持活动状态(因此不会退出VM)? 我问的部分原因是因为我已经看到它曾经绕过了关闭实际的ExectorService的需要。 您能想到绕过其关闭生命周期会产生不良影响的情况吗? 到目前为止,我能够提出使用守护进程的唯一原因是采取捷径,我想欣赏它可能导致的任何意外的副作用。

使用java ConcurrentHashMap实现缓存

我想在Web java应用程序中实现对重量级对象的简单缓存。 但我无法弄清楚如何正确地做到这一点。 我错过了什么或ConcurrentHashMap方法(putIfAbsent,…)是不够的,需要额外的同步? 是否有更好的简单API(在内存中,没有外部配置)来做到这一点? P.

如何同步PL / SQL调用的java方法

我只是遇到了一个与并发相关的问题,其逻辑流程是当客户端(称为Oracle Forms)提交请求(称为并发程序)并调用plsql过程时,此过程最终将调用java静态方法。 我发现当我在同一时间或非常短的间隔(如1秒)内提交两个请求时,会注意到一些并发问题。 java方法是做一些事情的起点,从数据库中搜索建议应该将哪些记录插入到数据库中。 问题是,它们会导致重复的结果,因为当我查询时,两个请求都可以很好地插入新记录。 我试过在静态java方法中添加synchronized ,但这并没有解决这个问题,为什么呢? 我所做的是: public static synchronized void execute 请注意,插入将在plsql中调用,这意味着如果仅同步java方法,则执行不充分的同步。 但是当我查看日志时,它会显示两个请求在同一秒内运行,我不认为这是正常的! 因为查询数据库和做建议是耗时的。 为了使java方法非常耗时,我添加了一个代码调用Thread.sleep(5000) ,并记录此代码后的时间并记录线程ID。 惊喜地发现Thread id是1! 而且,他们通过睡眠的时间也在同一时间。 这是为什么? 我该怎么做才能解决问题? 对java方法或pl sql的任何锁定? PS:我现在正在尝试使用DMBS_LOCK ,这似乎有效,但我仍然希望知道java方法不同步的原因。

Singleton实现中的Initialize-On-Demand习语与简单的静态初始化程序

使用静态初始化实现线程安全单例时,Initialize-On-Demand习惯用法是否真的必要,或者实例的简单静态声明是否足够? 将实例简单声明为静态字段: class Singleton { private static Singleton instance=new Singleton(); private Singleton () {..} public static Singleton getInstance() { return instance; } } VS class Singleton { static class SingletonHolder { static final Singleton INSTANCE = new Singleton(); } private Singleton () {..} public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } 我问这个是因为Brian Goetz在本文中推荐了第一种方法: http://www.ibm.com/developerworks/java/library/j-dcl/index.html […]

为什么无法锁定ConcurrentHashMap进行独占访问?

来自#JCIP的引用: “由于ConcurrentHashMap无法被锁定以进行独占访问,因此我们无法使用客户端锁定来创建新的primefaces操作,例如put-if-absent,就像我们为Vector所做的那样” 为什么我们不能只是获取锁以实现其他primefaces方法并保持集合线程安全 (如Collections.synchronizedxxx工厂返回的同步集合):

Java并发对象池?

我尝试将外部非线程安全库集成到我的Web项目中; 我发现为每个客户端线程创建此对象的实例太昂贵了。 因此,我想创建一个具有以下属性的对象池。 动态对象创建时,动态创建池中的对象,而不是在构造函数中创建它们。 池最初为空,当客户端线程获取资源对象时,池可以按需创建新资源。 一旦创建的对象的数量达到池的大小; 然后将阻止新的客户端线程,并等待其他线程回收资源。 池应该是公平的,公平性确保第一个要求的线程是获得的第一个线程; 否则有些线程可能会永远等待。 我该怎么做? 如果有一个有效的例子,我将不胜感激。

如何立即停止使用ExecutorService启动的任务?

我已经尝试了许多不同的方法来立即停止使用ExecutorService启动的任务,但没有运气。 Future future = executorService.submit(new Callable( public Void call () { … do many other things here.. if(Thread.currentThread.isInterrupted()) { return null; } … do many other things here.. if(Thread.currentThread.isInterrupted()) { return null; } } )); if(flag) { // may be true and directly cancel the task future.cancel(true); } 有时候我需要在启动后立即取消任务,你可能会好奇我为什么要这样做,你可能会想象一个用户不小心点击“下载”按钮启动“下载任务”并且他立即想要取消操作,因为它只是偶然的点击。 问题是在调用future.cancel(true)之后 ,任务没有停止, Thread.currentThread.isInterrupted()仍然返回false ,我无法知道任务是从call()方法内部停止的。 我想在调用future.cancel(true)并在call()方法中不断检查该标志后设置一个像cancelled = […]

一步后弹簧批流/分流

我正在构建一个包含以下过程的弹簧批处理解决方案: 步骤1:将列表拆分为多个列表步骤2:处理每个子列表步骤3:合并子列表 生成的子列表可以并行处理,并且根据spring-batch文档支持。 遗憾的是,我只能找到以并行步骤开始的弹出批处理示例作业,而不是按顺序开始的示例。 以下作业无法编译。 Spring给了我一个错误:’无法解决step2′ 那么,如何将作业配置为首先运行单个步骤,而不是并行运行多个步骤,然后运行最后一个步骤?

我可以在Oracle中进行primefacesMERGE吗?

我在一个WebLogic集群中运行了几个J2EE应用程序实例。 在某些时候,这些应用程序会执行MERGE以将记录插入或更新到后端Oracle数据库中。 MERGE检查是否存在具有指定主键的行。 如果它在那里,请更新。 如果没有,请插入。 现在假设两个应用程序实例想要插入或更新主键= 100的行。假设该行不存在。 在合并的“检查”阶段,他们都看到行没有,所以他们都试图插入。 然后我得到一个唯一的键约束违规。 我的问题是:Oracle中是否存在primefacesMERGE? 我正在寻找一些与PL / SQL中的INSERT … FOR UPDATE类似的效果,除了我只能从我的应用程序执行SQL。 编辑:我不清楚。 我仍在使用MERGE语句,但仍会出现此错误。 问题是,只有“修改”部分是primefaces的,而不是整个合并。