Tag: 并发

同时读取文件(首选java)

我有一个需要几个小时才能处理的大文件。 所以我正在考虑尝试估计块并且并行读取块。 是否可以在单个文件上并发读取? 我已经查看了RandomAccessFile以及nio.FileChannel但基于其他post我不确定这种方法是否有效。

在Java中写长和双是不是primefaces的?

读取和写入单个变量是primefaces的(语言保证!),除非变量的类型为long或double。 我正在读一个课程的幻灯片,我发现写了。 这节课讲的是并发性。 任何人都可以向我解释为什么写长或双不是primefaces操作? 这让我感到惊讶。

Java ConcurrentHashMap优于HashMap性能吗?

我刚刚阅读了“清洁代码”一书,并发现了这一说法: 当Java年轻的时候,Doug Lea写了一本开创性的书[8] Java中的Concurrent Programming。 随着本书的出现,他开发了几个线程安全的集合,后来成为java.util.concurrent包中JDK的一部分。 该软件包中的集合对于multithreading情况是安全的,并且它们表现良好。 实际上,几乎在所有情况下, ConcurrentHashMap实现都比HashMap表现更好 。 它还允许同时并发读取和写入,并且它具有支持常见复合操作的方法,否则这些操作不是线程安全的。 如果Java 5是部署环境,请从ConcurrentHashMap开始 请注意,在上面的引用中,我使用了“[n]”,其中n是某个数字,表示作者提供引用的地方,正如您所看到的,他没有为粗体部分提供任何参考。 并不是说我不相信这个陈述,但我很想知道这个陈述的支持证据。 那么,有没有人知道任何显示ConcurrentHashMap和HashMap的性能统计信息的资源? 或者任何人都可以向我解释为什么ConcurrentHashMap比HashMap快? 当我rest时,我可能会调查ConcurrentHashMap的工作实现,但是现在我想听听SOERS的回答。

关于Java中死锁情况的问题

我正在学习Java中的死锁,并且有来自Sun官方教程的示例代码: 阿方斯和加斯顿是朋友,也很有礼貌的信徒。 严格的礼貌规则是,当你向朋友鞠躬时,你必须保持鞠躬,直到你的朋友有机会归还弓。 不幸的是,这条规则没有考虑到两个朋友可能同时互相鞠躬的可能性。 public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void bow(Friend bower) { System.out.format(“%s: %s has bowed to me!%n”, this.name, bower.getName()); bower.bowBack(this); } public synchronized void bowBack(Friend bower) { System.out.format(“%s: %s […]

如何通过线程访问Runnable对象?

可能重复: need-help-returning-object-in-thread-run-method 你好。 我有一个实现runnable的类,我有一个List,存储用该类的不同对象实例化的Threads。 在线程对象运行它们的情况下,如何访问底层对象的属性? 这是一个例子: public class SO { public static class TestRunnable implements Runnable { public String foo = “hello”; public void run() { foo = “world”; } } public static void main(String[] args) { Thread t = new Thread(new TestRunnable()); t.start(); //How can I get the value of `foo` here? } }

multithreading可以在Java中看到直接映射的ByteBuffer上的写入吗?

我正在开发一些使用ByteBuffers的东西,它使用内存映射文件(通过FileChannel.map() )以及内存中的直接ByteBuffers构建。 我试图了解并发和内存模型约束。 我已经阅读了FileChannel,ByteBuffer,MappedByteBuffer等所有相关的Javadoc(和源代码)。很明显,特定的ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法。 因此,如果跨线程使用该缓冲区,则必须在修改特定ByteBuffer的状态时进行同步。 常见的技巧包括使用ThreadLocal包装ByteBuffer,复制(同步)以获取指向相同映射字节的新实例等。 鉴于这种情况: manager有一个映射的字节缓冲区B_all用于整个文件(比如它<2gb) 管理器调用B_all上的duplicate(),position(),limit()和slice()来创建一个新的较小的ByteBuffer B_1 ,该文件的一大块并将其提供给线程T1 manager执行所有相同的操作来创建指向相同映射字节的ByteBuffer B_2并将其提供给线程T2 我的问题是:T1能否同时写入B_1和T2写入B_2并保证看到彼此的变化? T3是否可以使用B_all读取这些字节并保证看到T1和T2的变化? 我知道,除非您使用force()指示操作系统将页面写入磁盘,否则不一定会在进程中看到映射文件中的写入。 我不在乎。 假设这个问题,这个JVM是编写单个映射文件的唯一进程。 注意:我不是在寻找猜测(我可以自己做得很好)。 我想引用一些关于内存映射直接缓冲区保证(或不保证)的内容。 或者,如果您有实际经验或负面测试用例,那么这也可以作为充分的证据。 更新:我已经完成了一些测试,让多个线程并行写入同一个文件,到目前为止,这些写入似乎可以从其他线程立即看到。 我不确定我是否可以依赖它。

退出Swing应用程序时偶尔会出现InterruptedException

我最近将我的计算机更新为更强大的计算机,配备了四核超线程处理器(i7),因此可以提供大量真正的并发性。 现在我在退出( System.exit(0) )我正在开发的应用程序(使用Swing GUI)时偶尔会出现以下错误: Exception while removing reference: java.lang.InterruptedException java.lang.InterruptedException at java.lang.Object.wait(Native Method) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at sun.java2d.Disposer.run(Disposer.java:125) at java.lang.Thread.run(Thread.java:619) 好吧,鉴于它开始发生在具有更多并发能力的硬件上,并且它与线程有关,并且它偶尔发生,它显然是某种时间性的东西。 但问题是堆栈跟踪太短了。 我只有上面的列表。 它根本不包含我自己的代码,因此有点难以猜测bug的位置。 以前有没有经历过这样的事情? 任何想法如何开始解决它? 编辑:因为退出使用System.exit(0)的Swing应用程序可能是“不干净”,但我不想将主框架设置为EXIT_ON_CLOSE因为我想确保在应用程序退出时没有任何关键问题,我添加了一个机制,以便在调用System.exit(0)之前执行主框架的dispose()方法。 所以它现在应该很干净,但偶尔也会发生exception。 它发生在调用System.exit(0)之后; dispose()没有问题。 也就是说,它必须来自一个关闭钩子: mainFrame.dispose(); // No problem! After this returns, all visible GUI is gone. // In fact, if there were no other threads around, […]

Java长时间运行的任务线程中断vs取消标志

我有一个长期运行的任务,如: public void myCancellableTask() { while ( someCondition ) { checkIfCancelRequested(); doSomeWork(); } } 任务可以取消(请求取消,checkIfCancelRequested()检查取消标志)。 通常当我写这样的可取消循环时,我使用一个标志来表示已经请求取消。 但是,我知道我也可以使用Thread.interrupt并检查线程是否被中断。 我不确定哪种方法是首选,为什么,想法? 谢谢, 杰夫

为什么ThreadGroup受到批评?

我知道使用Executors而不是ThreadGroup的当前做法: 通常首选的方式来处理线程 从线程等中捕获exception…… 但是, ThreadGroup本身的固有缺陷是什么(我听过那个类的含糊不清的批评)? 谢谢你的回答。 PS。 这似乎没有回答这个问题。

Java BlockingQueue take()vs poll()

在无限循环中使用队列中的值时 – 更有效: 1)阻止队列,直到通过take()获得值 while (value = queue.take()) { doSomething(value); } 2)睡眠n毫秒并检查物品是否可用 while (true) { if ((value = queue.poll()) != null) { doSomething(value); } Thread.sleep(1000); }