Tag: 并发

java.util.concurrent.Future中的方法cancel()是否会阻塞?

我正在尝试在我的项目中实现Future 接口。 但看起来文档对它来说有点模糊。 从官方文档我们可以推断出: 方法cancel()不会抛出InterruptedException或ExecutionException等exception。 此外,它没有超时的变体。 所以看起来,它不应该阻止。 文档说 此方法返回后,对isDone()的后续调用将始终返回true。 但 boolean isDone()如果此任务已完成,则返回true。 因此,如果我们在任务处理时运行cancel()并且无法取消,则此方法应该等到任务完成。 哪个与1相矛盾。 cancel()的返回值描述为 返回:如果无法取消任务,则返回false,通常是因为它已经正常完成; 否则是真的 因此,如果任务正在运行并且可能被取消但不是在这个确切的时刻,我们应该返回true(我们不能声明它不能被取消)或等待(但它与1相矛盾)。 但也有一个声明 如果此方法返回true,则对isCancelled()的后续调用将始终返回true。 但 boolean isCancelled()如果此任务在正常完成之前被取消,则返回true。 当我们在任务运行时运行cancel()并且不能说任务是否可以被取消时(因为在这种情况下cancel()应该返回true,但是isCancelled()应该返回false),这与3相矛盾。 看起来很久以前这个API已经被解除了,并且这些不一致不应该出现在文档中。 但那里有。 我不明白了吗?

具有多个线程的’N’项的进程列表

我有N项目的List ,我想在固定数量的threads之间按顺序划分此List 。 顺序我的意思是,我想传递1 to N/4到第一个thread , N/4 + 1 to N/2到第二个线程和N/2+1 to N到第三个thread ,现在一旦所有threads完成了他们的工作,我想通知主thread发送一些消息,说明所有处理都已完成。 到目前为止我所做的是我已经实现了ExecutorService 我做了这样的事 ExecutorService threadPool = Executors.newFixedThreadPool(Number_of_threads); //List of items List List itemList = getList(); for (int i = 0 i < Number_of_threads ;i++ ) { //how to divide list here sequentially and pass it to some processor while will process […]

需要帮助java web app设计来执行后台任务

我有一个安装在台式PC上的本地Web应用程序,它需要通过Web服务定期与远程服务器同步。 我有一个“事务”表,用于存储已在本地处理并需要发送到远程服务器的事务,此表还包含从远程服务器检索的事务(已远程处理)并需要执行本地(它们已使用Web服务调用检索)…事务按时间顺序执行,以确保以正确的顺序处理它们。 交易类型的一个例子是来自商店的项目的“贷款”和“退货”,例如video租赁商店。 例如,某些东西可能已在本地借出并远程返回,反之亦然,或任何一系列的贷款/退货事件。 还有从远程服务器检索的其他信息以更新本地记录。 当用户在本地执行任务时,我会实时更新本地数据库,并将事务添加到表中,以便与远程服务器进行后台处理。 处理后台任务的最佳方法是什么。 我尝试使用在HTTPSessionListener中创建的Thread,并在删除会话时使用interrupt(),但我不认为这是最安全的方法。 我也尝试使用会话属性作为锁定机制,但这也不是最好的方法。 我也想知道你怎么知道一个线程何时完成它的运行,以避免同时运行另一个线程。 或者线程是否在完成之前已经丢弃。 我已经提出了另一个建议,使用Quartz调度程序,我还没有详细阅读这种方法。 我将在实践中购买Java Concurrency的副本,但在我遇到它之前,我想要一些关于最佳方法的想法的帮助。 顺便说一下,我没有使用Web应用程序框架。 谢谢。

Java并发:同步(this)=>和this.wait()和this.notify()

感谢您帮助理解“并发示例”: http : //forums.sun.com/thread.jspa?threadID = 735386 Qute开始: public synchronized void enqueue(T obj) { // do addition to internal list and then… this.notify(); } public synchronized T dequeue() { while (this.size()==0) { this.wait(); } return // something from the queue } 报价结束: 我的问题是:为什么这段代码有效? =>当我同步像“ public synchronized ”=>这样的方法时,我同步“对象的实例==> this ”。 但是在上面的例子中: 调用“出列”我会得到“锁定/监视” 现在我在出队方法。 由于列表为零,调用线程将“ waited ” 根据我的理解,我现在有一个死锁情况,因为我没有机会从一个其他线程中获取一个对象,因为“dequeue”方法还没有完成,并且dequeue“method”持有this的锁定:所以我永远不会有可能称之为“enequeue”,因为我不会得到“ […]

Java在线程启动之前发生

我读到某个地方,开始一个线程对关系之前发生的事情有一些特殊的影响。 现在我不确定我的代码是否保证在关系之前发生的事情,所以请赐教。 我有一个Dispatcher线程和一个实现Runnable接口的Worker类。 Dispatcher线程创建Worker的新实例,并通过带元素的add方法填充Worker实例中的LinkedList 。 然后,Dispatcher通过execute方法将Worker实例交给ExecutorService 。 然后,Worker类中的run方法开始从LinkedList访问和删除东西。 新启动的Worker实例是否看到与Dispatcher一样的LinkedList状态? 或者可能是LinkedList处于某种不一致的状态? 我是否必须在同步方法中填充LinkedList ?

没有内存屏障的无序写入:数据竞争的唯一可能原因?

在Brian Goetz的实践中通过Java Concurrency时,我遇到了以下行: 当一个变量被多个线程读取并由至少一个线程写入时,会发生数据争用,但读取和写入不是由before-before排序的 。 正确同步的程序是没有数据竞争的程序; 正确同步的程序表现出顺序一致性,这意味着程序中的所有操作似乎都以固定的全局顺序发生。 我的问题是,乱序是写java或其他编程语言中数据竞争条件的唯一原因吗? UPDATE 好的,我做了一些关于数据竞争的调查,并从oracle官方网站上找到了以下内容: 线程分析器检测在执行multithreading进程期间发生的数据争用。 数据竞争发生在: 单个进程中的两个或多个线程同时访问同一个内存位置,并且 至少有一个访问是用于写入,和 线程没有使用任何独占锁来控制它们对该内存的访问。 当这三个条件成立时, 访问顺序是非确定性的 ,并且计算可以根据该顺序从运行到运行给出不同的结果。 某些数据争用可能是良性的(例如,当内存访问用于忙等待时),但许多数据争用是程序中的错误。 在这一部分中,提到: 访问顺序是非确定性的 它是在讨论线程访问内存位置的顺序吗? 如果是,那么同步永远不会保证线程将访问代码块的顺序。 那么,同步如何解决数据竞争问题呢?

如何使ScheduledExecutorService在其计划任务被取消时自动终止

我正在使用ScheduledExecutorService来关闭网络连接,如果它已打开超过几个小时。 但是,在大多数情况下,网络连接在达到超时之前关闭,因此我取消了ScheduledFuture 。 在这种情况下,我还希望执行程序服务终止并释放其线程池。 令我惊讶的是,这不是开箱即用的:虽然我在调度任务后在执行程序服务上调用了shutdown() ,但执行程序服务在其唯一的计划任务被取消时不会自动终止。 从ExecutorService.shutdown()的JavaDoc中,这种行为甚至可能是正确的,因为可以说取消的任务还没有被“执行”: void java.util.concurrent.ExecutorService.shutdown() 启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有其他影响。 我的问题是,是否可以更改:是否可以将执行程序服务配置为在其唯一的计划任务被取消时自动终止? 或者写为JUnit测试的同一个问题: @Test public void testExecutorServiceTerminatesWhenScheduledTaskIsCanceled() throws Exception { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Runnable task = new Runnable() { @Override public void run() { // … } }; ScheduledFuture scheduledTask = scheduler.schedule(task, 2000, TimeUnit.MILLISECONDS); scheduler.shutdown(); // do more configuration here… Thread.sleep(1000); scheduledTask.cancel(false); Thread.sleep(100); assertThat(scheduler.isTerminated(), […]

并发代码分析器

我想知道是否有任何框架或应用程序(app)/程序可以分析任何Java代码的并发性? 如果该工具知道jre传送的类和方法的所有实现,那么它归结为对同步块和方法及其调用层次结构的简单分析。 从这里它可以创建一个petri网,并告诉你,如果你可能遇到死锁。 我错过了什么或者这真的很容易吗? 然后必须有一些很酷的工具做这种东西? 或者这样的工具是否会报告太多可能因为一些底层程序/业务逻辑而完全保存的死锁? Petri网应该足够强大以处理这些情况? 这将节省大量工时搜索可能与死锁问题相关或可能不存在的错误。

窗户上的虚假唤醒。 可能吗?

我最近学会了“虚假唤醒”任何人都说这个问题只适用于某些类型的Linux PC。 我用的是windows。 我写了Spurious唤醒测试。 我得到的结果是可能的。 但我想为你展示这个测试。 也许我在某处犯了错误。 我最初的变种: import java.util.Random; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; public class TestSpuriousWakeups { static final int MAX_THREADS = 600; static final Object mutex = new Object(); static final CountDownLatch allThreadsStarted = new CountDownLatch(MAX_THREADS); static final CountDownLatch allThreadsFinished = new CountDownLatch(1); static /*final*/ volatile AtomicInteger processedThreads = new AtomicInteger(); static /*final*/ […]

在Java中,如何在actionPerformed线程当前运行时重新绘制面板?

我有一个类(称为Class_GUI),它有一个面板上有很多按钮。 Class_GUI有一些方法可以改变按钮的文本和颜色。 我还有一个带有actionPerformed方法的程序。 调用它时,它会创建一个Class_GUI实例,并重复调用Class_GUI方法,更改按钮等。 我遇到的问题是,一旦actionPerformed方法完全完成,按钮只能正常显示,而我想在调用每个Class_GUI方法后更改它。 到目前为止,我的尝试是在每个Class_GUI方法中,我在方法结束时执行此操作: SwingUtilities.invokeLater(Refresh_GUI); 定义Refresh_GUI的位置: Runnable Refresh_GUI = new Runnable(){ public void run(){ frame.revalidate(); frame.repaint(); } };