Tag: 并发

Java EE并发和锁定

我有一个MDB(消息驱动的bean),它接收带有String的消息,代表一个单词。 我在数据库中也有一个表。 MDB应该在表格中存储单词和每个单词被接收的次数(计数器)。 问题是为了获得更好的性能,MDB在许多实例中启动,并且当不同实例接收到相同的新单词时,它们都创建计数为1的同一行。 为了解决这个问题,我应该使单词字段唯一,然后第二个实例将在提交时失败,重新传输消息,这将起作用,但可能有问题。 这是一个好习惯吗? 另一种解决方案是在对计数器求和之后合并这些线。 但是如果另一个实例会在更新过程中增加计数器呢? 如果两个实例试图增加计数器怎么办? @Version应该够了吗? 我不确定这里的解决方案是什么。 你会如何处理这类案件? 您也可以建议一些关于并发实践的书籍(不是因为我需要支持Java EE而使用synchronized ,而是可能运行应用程序服务器集群)? 更新:在阅读了有关EJB和JPA的更多信息之后,我想我想要一个类似锁定实体的东西。 例如,我可以创建一个只有id和key列的新表,数据如下: ID | KEY 1 | WORDS_CREATE_LOCK 因此,当我需要处理一个新单词时,我会做这样的事情(不是确切的代码,不确定它甚至会编译): // MAIN FUNCTION public void handleWord(String wordStr) { Word w = getWord(wordStr); if (w == null) w = getNewOrSychronizedWord(wordStr); em.lock(w); w.setCounter(w.getCounter() + 1); em.unlock(w); } // Returns Word instance or null […]

ExecutorService超时而不阻塞主线程

我想在有时间限制的后台执行一些工作。 问题是,我不想阻止主线程。 天真的实现是拥有两个执行者服务。 一个用于调度/超时,第二个用于完成工作。 final ExecutorService backgroundExecutor = Executors.newSingleThreadExecutor(); final ExecutorService workerExecutor = Executors.newCachedThreadExecutor(); backgroundExecutor.execute(new Runnable() { public void run() { Future future = workerExecutor.submit(new Runnable() { public void run() { // do work } }); try { future.get(120 * 1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { logger.error(“InterruptedException while notifyTransactionStateChangeListeners()”, e); future.cancel(true); } catch (ExecutionException […]

Java中的并发排序

我目前正在开发一个程序来同时对字符串进行排序。 我的程序接收一个文件,将文件的每一行读入一个数组,并将字符串数组拆分成较小的字符串数组。 然后程序为每个较小的arrays启动一个线程,并快速排序。 一旦每个线程完成对其数组的排序,主线程就会收集线程对象的所有结果。 然后,它应该将较小的,现在已排序的数组合并为一个大的排序数组。 我知道我的快速排序实现有效 – 使用一个线程程序对单词进行排序。 我需要的是一种将线程返回的数组嵌套在一起的算法。 任何帮助表示赞赏 – 提前谢谢。

要在按钮上设置延迟,请单击java?

我在JFrame有一个保存按钮;点击保存时,“保存”文本设置为“保存….”; 我需要在延迟10秒后将该文本设置为“已保存”。如何在java中实现? 请帮忙… try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } 这就是我所做的……但是在这个延迟的时间里,这不会显示为“拯救”。

JavaFX UI冻结问题

我试图显示每项任务的进度和状态。 每个任务一行代表TableView 。 每个任务在每个Thread执行并行执行。 请参考TableView图片。 对于“Progress” TableColumn我将Cell Factory设置为渲染“ProgressBar”。 public static class ProgressBarTableCell extends TableCell { private final ProgressBar progressBar; private ObservableValue ov; public ProgressBarTableCell() { this.progressBar = new ProgressBar(); progressBar.setPrefHeight(23); setAlignment(Pos.CENTER); } @Override public void updateItem(T item, boolean empty) { super.updateItem(item, empty); if (item == null) { setGraphic(null); setText(null); } else { if (item.toString().equalsIgnoreCase(“Processing”)) { […]

扩展HashMap 并仅同步puts

我最近在代码库上遇到了一个扩展HashMap并同步put方法的类。 除了使用ConcurrentHashMap效率低之外,扩展HashMap和仅同步put(K,V)可能会出现什么样的问题? 假设我们不关心get(K)是否返回最新值(例如,我们可以使用线程覆盖彼此,并且我们不关心如果使用地图的值可能出现的竞争条件作为锁自己)。 例: public class MyMap extends HashMap { //… public synchronized void put(K key, V value) { //… } //… } 据我所知,HashMap使用put方法重新resize,并且因为put在map实例级别同步,所以在(可能)不会遇到并发重新resize时遇到​​的问题。 即使有上面​​可疑的假设,我的直觉也告诉我,可能会出现更多问题。 或者我只是偏执狂? 更新:谢谢大家,这很有趣,也很有启发性。 如果我遇到这个特定class级的作者的原作,我现在可以详细解释他的愚蠢。 🙂 总结:putAll仍然可以搞砸数据结构,最终陷入可怕的无限循环/数据争用状态。 get依赖于hashmap的底层内部数据结构,这些结构可能正在被同时修改,导致get进程表现得很奇怪。 这只是个坏主意。 至少,作者可能已经使用了Collections.synchronizedMap(Map)。 注意:截至本文撰写时给出的所有三个答案实际上都是正确的,但我选择了一个关于get()作为正确答案的答案,因为对我来说这是最不明显的答案。

primefaces读取然后在Java中写入ByteBuffer的一部分

我在java中有一个ByteBuffer ,想要读取,然后有条件地修改该字节,例如使用如下方法: public void updateByte(int index) { byte b = this.buffer.getByte(index); if (b == someByteValue) { this.buffer.setByte(index, someNewByte); } } 我怎样才能确保读取然后修改一个字节以primefaces方式发生? 我不想同步整个ByteBuffer或updateByte方法,因为我希望多个线程能够同时读/写缓冲区的不同字节(即只要index是多个线程就可以同时调用updateByte )不同)。 我正在使用的ByteBuffer没有byte []支持,所以在上面的例子中bb.hasArray() == false 。

转换wait&notifyAll代码以使用Java 1.5 Lock对象

我们使用在代码段周围使用同步块的代码,需要大量的wait和notifyAll()调用。 我们正在尝试将这些转换为使用Java 5 Lock.lock()和Lock.unlock()方法。 如何迁移此代码以删除所有wait和notifyAll调用。 我不知道使用新的锁定function相当于这些。 任何与示例的链接将不胜感激。 提前致谢 方程式,下面的代码需要转换为使用Lock.lock()和lock.unlock删除synchronized块的第一部分很简单,因为我只需要调用lock()方法。 问题是可以为notifyAll()和wait方法做些什么。 同步(LOCK) { while(!Thread.interrupted()) { 尝试 { working = runRules(); 如果(!工作) LOCK.notifyAll(); LOCK.wait(工作?shortTimeout:longTimeout); } catch(最终InterruptedException e) { Package.log.info(“线程被中断。退出。”,e); 返回; } } }

可调用执行期间的exception

我有以下Callable: public class Worker implements Callable{ @Override public Boolean call(){ boolean success=true; //do Something return success; } } 现在我正在执行它: Worker worker – new Worker(); Future submit = executor.submit(worker); 我正在以一种hashMap的forms存储提交,以便在代码中的某个地方执行某些操作。 我怎么知道worker.call()函数中是否发生了exception? 如果出现某种exception, submit.isCancelled()返回true,如果一切正常,则返回false吗?

DelegatingVehicleTracker(第65页Goetz)如何返回“实时”视图?

在Java Concurrency in Practice的第65和66页上,Brian Goetz列出了以下代码: @ThreadSafe public class DelegatingVehicleTracker { private final ConcurrentMap locations; private final Map unmodifiableMap; public DelegatingVehicleTracker(Map points) { locations = new ConcurrentHashMap(points); unmodifiableMap = Collections.unmodifiableMap(locations); } public Map getLocations() { return unmodifiableMap; } public Point getLocation(String id) { return locations.get(id); } public void setLocation(String id, int x, int y) { if […]