Tag: 并发

何时使用SwingUtilies.invokeAndWait / invokeLater

我在某处看到,对于影响gui视觉效果的任何线程,它应该使用SwingUtilities.invokeAndWait / invokeLater在EDT中运行 对于一个基本的gui,是否需要添加类似new SwingGUI().setVisible(true); 在使用invokeAndWait的EDT中? 只是为了展示? 这算数了吗?

执行程序服务 – 线程超时

在我探索ExecutorService ,我遇到了一个接受timeout的方法Future.get() 。 这种方法的Java文档说 如果需要,最多等待计算完成的给定时间,然后检索其结果(如果可用)。 参数: 超时等待的最长时间 单位超时参数的时间单位 根据我的理解,我们在callable上强加了一个超时,我们提交给ExecutorService这样,我的callable将在指定的时间(超时)过后中断 但是根据下面的代码, longMethod()似乎超出了超时(2秒),我很难理解这一点。 谁能请我指出正确的道路? import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Timeout implements Callable { public void longMethod() { for(int i=0; i< Integer.MAX_VALUE; i++) { System.out.println("a"); } } @Override public String call() throws Exception { longMethod(); return "done"; } /** * @param args */ […]

优雅地将队列长度指示符实现到ExecutorServices

为什么,为什么java.util.concurrent没有为其ExecutorService提供队列长度指示器? 最近我发现自己做了这样的事情: ExecutorService queue = Executors.newSingleThreadExecutor(); AtomicInteger queueLength = new AtomicInteger(); … public void addTaskToQueue(Runnable runnable) { if (queueLength.get() < MAX_QUEUE_LENGTH) { queueLength.incrementAndGet(); // Increment queue when submitting task. queue.submit(new Runnable() { public void run() { runnable.run(); queueLength.decrementAndGet(); // Decrement queue when task done. } }); } else { // Trigger error: too long queue […]

这个Singleton对序列化和reflection攻击都有抵抗力吗?

以下代码是否对序列化和reflection攻击都有抵抗力? public class Example{ private static Example instance=new Example(); private Example(){} public static Example getInstance(){ return instance; } }

线程中断:是否会取消即将到来的wait()调用?

我有一个具有传入作业队列的线程(包含作业描述的LinkedList )。 当没有工作要做时,线程在队列上阻塞wait() 。 外部作业调度程序对象在将新作业放入队列时使用notify()唤醒它。 在关闭我的程序时,我调用Thread上的interrupt() 。 当线程等待wait()作业时,这会引发InterruptedException 。 我的问题是:如果我在没有阻塞但是做某种工作的情况下中断线程会发生什么,处理后的项目是队列中的最后一个(所以队列现在是空的)并且执行在中断之前超过了isInterrupted()检查标志是否已设置,因此它再次调用wait() ? 是否会抛出InterruptedException因为已经设置了中断标志或者线程永远等待,因为新的作业永远不会到达队列并且没有人可以中断等待?

多个Java线程似乎锁定了同一个监视器?

在Java threaddump中,我发现了以下内容: “TP-Processor184” daemon prio=10 tid=0x00007f2a7c056800 nid=0x47e7 waiting for monitor entry [0x00007f2a21278000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725) – locked (a org.apache.jackrabbit.core.state.SharedItemStateManager) at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257) “TP-Processor137” daemon prio=10 tid=0x00007f2a7c00f800 nid=0x4131 waiting for monitor entry [0x00007f2a1ace7000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725) – locked (a org.apache.jackrabbit.core.state.SharedItemStateManager) at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257) 这里的重点是两个线程都锁定了监视器 (无论它们现在正在等待两个不同的其他监视器)。 在查看Thread Dump Analyzer时,如果选择了该监视器,它实际上会在底部显示“Threads locking monitor:2”,并且“2 […]

在Java中创建唯一的时间戳

我需要在Java中创建一个时间戳(以毫秒为单位),该时间戳保证在该特定VM实例中是唯一的。 我需要一些方法来限制System.currentTimeMillis()的吞吐量,这样它每ms最多返回一个结果。 关于如何实现的任何想法?

使用FutureTask而不是Callable有什么好处?

有两种方法可以提交和轮询任务结果 FutureTask futureTask = new FutureTask(callable); 使用Callable和Future组合并在ExecutorService提交。 使用future.get()检索结果。 Future future = service.submit(callable); 使用FutureTask 。 这将包装Callable ,然后使用FutureTask检索结果。 service.execute(task); 使用FutureTask不是Callable + Future组合有什么好处?

Java易失性和副作用

Oracle关于primefaces访问的文档( http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html )说明了这一点: “一个volatile变量建立一个发生在之前的关系…….这意味着……当一个线程读取一个volatile变量时,它不仅会看到volatile的最新变化,还会看到导致的代码的副作用改变。” 我无法绕过那条头。 我理解volatile变量是如何工作的(在> = Java 5中),但是我想知道java如何决定哪些副作用“导致”变化为volatile变量。 所以我想我的问题是:这种保证有哪些副作用? 编辑: 所以我已经知道如果线程A修改了一个volatile变量,然后线程B读取它,那么在写入volatile变量之前发生的所有线程A的写入都与线程B“相关”(即缓存的值)由线程A进行的前述写入的变量在线程B)中无效。 如我错了请纠正我。

什么时候CopyOnWriteArraySet有用来实现线程安全的HashSet?

在Java ,有一个名为ConcurrentHashMap的线程安全版HashMap和一个名为ConcurrentSkipListMap的线程安全版TreeMap ,但是HashSet没有ConcurrentHashSet 。 相反,通常有4种方法可以使用线程安全的Set : Set mySet = Collections.newSetFromMap(new ConcurrentHashMap()); Set s = Collections.synchronizedSet(new HashSet()); ConcurrentSkipListSet CopyOnWriteArraySet 1使用ConcurrentHashMap keySet()来实现Set和线程安全。 2使用synchronized方式,似乎不推荐这种方式。 3基于ConcurrentSkipListMap并被广泛使用。 4基于CopyOnWriteArrayList ,因此它共享CopyOnWriteArrayList的相同基本属性。 以下是从CopyOnWriteArraySet doc中选择的: http : //docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.html 它最适合于设置大小通常很小的应用程序,只读操作数量远远超过可变操作,并且您需要在遍历期间防止线程之间的干扰。 它是线程安全的。 变异操作(添加,设置,删除等)很昂贵,因为它们通常需要复制整个底层arrays。 迭代器不支持mutative remove操作。 遍历迭代器的速度很快,不会遇到来自其他线程的干扰。 迭代器在构造迭代器时依赖于不变的数组快照。 由于常用1和3,为什么CopyOnWriteArraySet存在? CopyOnWriteArraySet什么时候有用? 补充: CopyOnWriteArraySet基于CopyOnWriteArrayList ,而List数据结构中的contains操作是O(n),而Set数据结构是针对高性能contains操作的,有人可以解释一下吗?