Tag: 并发

石英:防止jobs.xml中的作业的并发实例

这应该很容易。 我使用的是在Apache Tomcat 6.0.18下运行的Quartz,而且我有一个jobs.xml文件 ,它可以设置每分钟运行的计划作业。 我想要做的是,如果在下一次触发时间到来的时候,工作还在运行,我不想开始新的工作,所以我可以让旧的实例完成。 有没有办法指定这在jobs.xml(防止并发实例)? 如果不是的话,有没有办法在我的应用程序的Job实现中(这是通过JobExecutionContext ?)共享访问内存中的单例,所以我可以自己处理并发? (并检测前一个实例是否正在运行) 更新:在文档中陷入困境之后,我正在考虑一些方法,但要么不知道如何让它们工作,或者有问题。 使用StatefulJob 。 这可以防止并发访问…但我不知道如果我使用它会发生什么其他的副作用,我也想避免以下情况: 假设触发时间是每一分钟,即触发#0 =在时间0,触发#1 = 60000msec,#2 = 120000,#3 = 180000等,并且在时间0触发#0触发我的工作需要130000msec。 用简单的Job,当作业触发器#0仍在运行时,它将执行触发器#1和#2。 使用StatefulJob,这将执行触发器#1和#2,在#0在130000结束后立即执行。我不想要那个,我想要#1和#2不运行,并且下一个运行作业的触发器应该发生在#3(180000msec)。 所以我仍然需要使用StatefulJob来做其他事情,以便按照我想要的方式工作,所以我没有看到使用它的好处。 使用TriggerListener从vetoJobExecution()返回true。 虽然实现接口看起来很简单,但我必须弄清楚如何以声明方式设置TriggerListener的一个实例。 找不到xml文件的文档 。 使用实现Job的我的类拥有的static共享线程安全对象(例如信号量或其他)。 我不喜欢在Tomcat / Quartz中通过static关键字使用单例的想法,不确定是否有副作用。 另外,我真的不希望他们成为真正的单身人士,只是与特定的工作定义有关。 实现我自己的触发器 ,它扩展了SimpleTrigger,并包含可以运行自己的TriggerListener的共享状态。 再一次,我不知道如何设置XML文件来使用这个触发器,而不是标准的<trigger><simple>…</simple></trigger> 。

并发编程的C + +?

我一直听说每个地方的并发编程。 你们可以点亮一下它是什么,以及c ++新标准如何促进这样做?

如果它像compareAndSet一样实现,weakCompareAndSet如何虚假地失败?

(注意,这个问题不是关于CAS,而是关于“可能虚假地失败”的 Javadoc)。 来自AtomicInteger类的这两个方法之间Javadoc的唯一区别是weakCompareAndSet包含注释: “可能虚假地失败” 。 现在,除非我的眼睛受到某种咒语的欺骗,否则这两种方法看起来都是一样的: public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } /* … * May fail spuriously. */ public final boolean weakCompareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } 所以我意识到“可能”并不意味着“必须”,但是为什么我们不把所有这些添加到我们的代码库中: public void doIt() { a(); } /** * May fail spuriously */ public […]

当队列满时ThreadPoolExecutor块?

我正在尝试使用ThreadPoolExecutor执行大量的任务。 以下是一个假设的例子: def workQueue = new ArrayBlockingQueue<Runnable>(3, false) def threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1L, TimeUnit.HOURS, workQueue) for(int i = 0; i < 100000; i++) threadPoolExecutor.execute(runnable) 问题是我很快得到java.util.concurrent.RejectedExecutionException,因为任务的数量超过了工作队列的大小。 但是,我期望的行为是让主线程阻塞,直到队列中有空间。 什么是完成这个最好的方法?

什么时候应该使用SynchronousQueue

new SynchronousQueue() new LinkedBlockingQueue(1) 有什么不同? 当我应该使用容量为1的LinkedBlockingQueue SynchronousQueue ?

BlockingQueue和TransferQueue之间的区别

我有点混淆了BlockingQueue / LinkedBlockingQueue和jsr166y和java 7中新的TransferQueue / LinkedTransferQueuetypes之间的区别

允许这个参考逃脱

我将不胜感激从“Java并发实践”中了解以下内容: 从构造函数中调用一个可覆盖的实例方法(一个既不是private也不是final)的方法也可以允许这个引用转义。 这里的“逃避”只是意味着在实例被完全构造之前,我们可能正在调用一个实例方法? 我没有看到“这个”以任何其他方式逃避实例的范围。 “最终”是如何防止这种情况发生的?在我创build的实例创build中,“最终”有一些方面吗?

如何使用Python的asyncio模块正确地创build和运行并发任务?

我正在尝试使用Python 3相对较新的asyncio模块正确理解和实现两个并发运行的Task对象。 简而言之,asyncio似乎devise用于处理asynchronous进程和并发Task在事件循环中的执行。 它促进使用await (在asynchronous函数中应用)作为一个无callback的方式来等待并使用一个结果,而不会阻塞事件循环。 (期货和callback仍是一个可行的select。) 它还提供了asyncio.Task()类,这是Future一个专门的子类,用于包装协程。 最好通过使用asyncio.ensure_future()方法来调用。 asyncio任务的预期用途是允许独立运行的任务与同一事件循环内的其他任务“同时”运行。 我的理解是Tasks连接到事件循环,然后在await语句之间自动继续驱动协程。 我喜欢能够使用并发任务而不需要使用某个Executor类的想法,但是我没有find关于实现的详细说明。 这就是我目前的做法: import asyncio print('running async test') async def say_boo(): i = 0 while True: await asyncio.sleep(0) print('…boo {0}'.format(i)) i += 1 async def say_baa(): i = 0 while True: await asyncio.sleep(0) print('…baa {0}'.format(i)) i += 1 # OPTION 1: wrap in Task object # […]

将asynchronous计算包装成同步(阻塞)计算

类似的问题: 包装一个asynchronousJavaScript函数使其同步的模式 在C#中同步包装asynchronous方法 我有一个方法,我想暴露给图书馆客户端(尤其是脚本客户端)的对象如下所示: interface MyNiceInterface { public Baz doSomethingAndBlock(Foo fooArg, Bar barArg); public Future<Baz> doSomething(Foo fooArg, Bar barArg); // doSomethingAndBlock is the straightforward way; // doSomething has more control but deals with // a Future and that might be too much hassle for // scripting clients } 但是我可用的原始“东西”是一组事件驱动的类: interface BazComputationSink { public void onBazResult(Baz […]

如何从Executors正确捕获RuntimeExceptions?

说我有以下代码: ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(myRunnable); 现在,如果myRunnable抛出一个RuntimeExcpetion ,我怎么能抓住它? 一种方法是将我自己的ThreadFactory实现提供给newSingleThreadExecutor()并为其中的newSingleThreadExecutor()设置自定义的uncaughtExceptionHandler 。 另一种方法是将myRunnable包装为包含try-catch- myRunnable的本地(匿名) Runnable 。 也许还有其他类似的解决方法。 但是…不知怎的,这感觉很脏,我觉得它不应该是这么复杂。 有一个干净的解决scheme吗?