草庐IT

Multithreading

全部标签

java - 确保所有任务完成的同步对象

我应该使用哪个Java同步对象来确保完成任意数量的任务?约束是:每项任务都需要很长时间才能完成,适合并行执行任务。有太多任务无法放入内存(即我无法将每个任务的Future放入Collection中,然后调用get在所有future上)。我不知道会有多少任务(即我不能使用CountDownLatch)。ExecutorService可能是共享的,所以我不能使用awaitTermination(long,TimeUnit)例如,对于GrandCentralDispatch,我可能会这样做:letworkQueue=dispatch_get_global_queue(QOS_CLASS_BA

java - 在删除条目时迭代 ConcurrentHashMap

我想在删除条目时定期迭代ConcurrentHashMap,如下所示:for(Iterator>iter=map.entrySet().iterator();iter.hasNext();){Entryentry=iter.next();//dosomethingiter.remove();}问题是在我迭代时另一个线程可能正在更新或修改值。如果发生这种情况,这些更新可能会永远丢失,因为我的线程在迭代时只会看到陈旧的值,但remove()将删除Activity条目。经过一番考虑,我想到了这个解决方法:map.forEach((key,value)->{//deleteifvalueisu

java - 迭代 WeakHashMap

我同时使用了WeakHashMap。我想基于一个Integer参数实现细粒度的锁定;如果线程A需要修改由Integera标识的资源,而线程B需要修改由Integerb标识的资源,则它们不需要同步。但是,如果有两个线程使用同一个资源,比如说线程C也在使用由Integera标识的资源,那么当然线程A和C需要在同一个锁上同步。当没有更多线程需要ID为X的资源时,可以移除映射中针对key=X的锁。但是此时可能会有另一个线程进来,尝试使用ID=X的Map中的锁,所以我们需要在加锁/拔锁时进行全局同步。(这是唯一一个每个线程都必须同步的地方,无论Integer参数如何)但是,线程无法知道何时移除锁

java - 如何以多线程方式从 rpt 生成 PDF 文档?

我有一个rpt文件,我将使用它生成多个pdf格式的报告。使用来自inetclear报告的Engine类。这个过程需要很长时间,因为我要生成近10000份报告。我可以使用多线程或其他一些方法来加快进程吗?任何有关如何完成的帮助都是有帮助的我的部分代码。//LoopsEngineeng=newEngine(Engine.EXPORT_PDF);eng.setReportFile(rpt);//rptisthereportnameif(cn.isClosed()||cn==null){cn=ds.getConnection();}eng.setConnection(cn);System.ou

java - 发送记录并等待其确认接收

我正在使用下面的类以同步方式或异步方式使用套接字将数据发送到我们的消息队列,如下所示。sendAsync-它异步发送数据,没有任何超时。发送(在LINEA上)后,它会添加到retryHolder存储桶中,这样如果未收到确认,它将从在构造函数中启动的后台线程再次重试。send-它在内部调用sendAsync方法,然后hibernate一段特定的超时时间,如果未收到确认,则从retryHolder中删除桶,这样我们就不会再试一次。因此,上述两种方法之间的唯一区别是-对于异步,我需要不惜一切代价重试,但对于同步,我不需要重试,但看起来它可能会被重试,因为我们共享相同的重试桶缓存和重试线程每1

java - 如何从 java 运行多线程 python 脚本?

我正在用Java构建一个框架,它将监听事件,然后在Jython中处理它们。不同的事件类型将发送到不同的脚本。由于在调用PythonInterpreter.exec()时jython需要相当长的时间来编译脚本,因此我将不得不预编译脚本。我正在按照以下方式进行操作://initializethescriptasstring(wouldloaditfromfileinfinalversion)Stringscript="print'foo'";//getthecompiledcodeobjectPyCodecompiled=org.python.core.__builtin__.compil

java - 线程作为 GC 根

我有一个关于GC根的问题。我读到GC根之一是“Livethread”。那是什么意思?我一直觉得每个线程都有自己的堆栈,堆栈的局部变量是线程的GC根,现在我很困惑。线程表示还有哪些不在帧堆栈或native堆栈上的其他类型的对象引用?另一个问题是新生代收集是使用GC根,还是仅用于主要算法?谢谢更新:好的,抱歉,为了简单起见:我读过这篇简短的文章:yourkit.com/docs/java/help/gc_roots.jsp并且有一个“线程”选项作为GC根,这到底意味着什么线程是一个GC根?ThreadGCroot引用了哪些对象,但其堆栈未引用哪些对象?为什么这两个类别不同?

java - 为什么我们不需要带有 StampedLock 的 volatile?

给定来自Oracle文档的代码示例https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/StampedLock.htmlclassPoint{privatedoublex,y;privatefinalStampedLocksl=newStampedLock();voidmove(doubledeltaX,doubledeltaY){//anexclusivelylockedmethodlongstamp=sl.writeLock();try{x+=deltaX;y+=deltaY;}finally{sl

java - 单事务跨多线程解决方案

据我了解,所有事务都是线程绑定(bind)的(即上下文存储在ThreadLocal中)。例如如果:我在事务父方法中启动事务在异步调用中使数据库插入#1让数据库在另一个异步调用中插入#2然后这将产生两个不同的事务(每个插入一个),即使它们共享相同的“事务”父级。例如,假设我执行了两次插入(并使用了一个非常简单的示例,即为了简洁起见,不使用执行程序或可完成的future等):@TransactionalpublicvoidaddInTransactionWithAnnotation(){addNewRow();addNewRow();}将根据需要执行两个插入,作为同一事务的一部分。但是,如

java - 交错并行文件读取比顺序读取慢?

我已经实现了一个小的IO类,它可以从不同磁盘上的多个相同文件读取(例如,包含相同文件的两个硬盘)。在顺序情况下,两个磁盘平均读取文件的速度为60MB/s,但是当我进行交错操作时(例如4k磁盘1、4k磁盘2然后组合),有效读取速度降低到40MB/s而不是增加?上下文:Win7+JDK7b70、2GB内存、2.2GB测试文件。基本上,我尝试以穷人的方式模仿Win7的ReadyBoost和RAIDx。在核心中,当向类发出read()时,它会创建两个带有指令的可运行程序,以从特定位置和长度读取预先打开的RandomAccessFile。使用执行程序服务和Future.get()调用,当两者都完