Tag: 并发

条件vs对象等待/通知

我正在阅读有关Condition对象以及它们如何为每个对象提供多个等待集,以及区分哪个对象或一组对象/线程获得特定信号。 为什么常规Object不这样做? 例如 代替: final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); 我们这样做: final Object notFull = new Object(); final Object notEmpty = new Object(); lock.lock(); try { while (count == items.length) notFull.wait(); […]

Java中的WaitForMultipleObjects

在Java(v6)中实现Win32等效的WaitForMultipleObjects最优雅的方法是什么。 线程正在hibernate,直到发生多个事件之一。 当发生这种情况时,我想处理它并重新入睡。 不需要数据,只需要一个事件。

有没有办法强制parallelStream()并行?

如果输入大小太小,则库会自动序列化流中映射的执行 ,但此自动化不会并且不能考虑映射操作的重要程度。 有没有办法强制parallelStream()实际并行化CPU 重图?

是否有可能在Java中有效地实现seqlock?

另一个问题让我想知道是否可以使用Java中的易失性版本计数器有效地实现seqlock 。 这是一个典型的实现,因为只有一个编写器线程的情况: class Seqlock { private volatile long version = 0; private final byte[] data = new byte[10]; void write(byte[] newData) { version++; // 1 System.arraycopy(newData, 0, data, 0, data.length); // 2 version++; // 3 } byte[] read() { long v1, v2; byte[] ret = new byte[data.length]; do { v1 = version; // 4 […]

中断线程等待用户输入然后退出应用程序

我有两个线程在运行, userInputThread等待来自命令行的用户输入,而interrupterThread在启动后1秒尝试中断userInputThread 。 显然,您无法中断被System.in阻止的线程。 另一个答案建议在中断线程之前使用System.in.close()关闭System.in 。 但是,当我运行以下代码时, userInputThread永远不会被中断,应用程序只是挂起而不关闭。 class InputInterruptionExample { private Thread userInputThread; private Thread interrupterThread; InputInterruptionExample() { this.userInputThread = new Thread(new UserInputThread()); this.interrupterThread = new Thread(new InterrupterThread()); } void startThreads() { this.userInputThread.start(); this.interrupterThread.start(); } private class UserInputThread implements Runnable { public void run() { try { System.out.println(“enter your name: “); String userInput = […]

HttpServlet没有实现runnable或extend thread,为什么它可以线程化?

对于可运行的对象,它需要实现Runnable接口或扩展Thread类,但是,似乎HttpServlet不会执行任何这些操作。 为什么HttpServlet可以被线程化或者我弄错了?

声明主方法同步

我看到一个Java示例,其主要方法标记为synchronized,调用另一个静态同步方法。 结果是,基本上,只有在main方法返回后,另一个方法才会在单独的线程上运行。 这种结构有哪些实用function? public class SynchronisedMain { public static synchronized void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { thingy(); } }).start(); System.out.println(“Kickstarted thingy thread.”); TimeUnit.MILLISECONDS.sleep(1000); } public static synchronized void thingy() { System.out.println(“Thingy!”); } }

Java线程可以在持有锁的同时获取锁吗?

如果一个线程持有一个锁 ,当线程需要进入由同一个锁控制的另一个关键部分时会发生什么?

Java读写锁定要求,具有来自不同线程的锁定和释放

我试图找到一个不那么笨重的Java并发问题的解决方案。 问题的关键在于,当仍有工作线程处于活动状态时,我需要对块进行关闭调用,但关键的方面是每个工作任务都是异步生成和完成的,因此保持和释放必须由不同的线程完成。 一旦他们的工作完成,我需要他们以某种方式向关闭线程发送信号。 只是为了让事情更有趣,工作线程不能互相阻塞,所以我不确定信号量在这个特定实例中的应用。 我有一个解决方案,我认为安全地完成了这项工作,但是我对Java并发工具的不熟悉使我认为可能有一个更容易或更优雅的模式。 在这方面的任何帮助将不胜感激。 这是我到目前为止所做的,除了评论之外相当稀疏: final private ReentrantReadWriteLock shutdownLock = new ReentrantReadWriteLock(); volatile private int activeWorkerThreads; private boolean isShutdown; private void workerTask() { try { // Point A: Worker tasks mustn’t block each other. shutdownLock.readLock().lock(); // Point B: I only want worker tasks to continue if the shutdown signal // hasn’t already been […]

如何使用ExecutorService进行轮询,直到结果到达

我有一个场景,我必须轮询远程服务器检查任务是否已完成。 一旦有,我会进行不同的调用以检索结果。 我原本认为我应该使用带有scheduleWithFixedDelay的SingleThreadScheduledExecutor进行轮询: ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); ScheduledFuture future = executor.scheduleWithFixedDelay(() -> poll(jobId), 0, 10, TimeUnit.SECONDS); public void poll(String jobId) { boolean jobDone = remoteServer.isJobDone(jobId); if (jobDone) { retrieveJobResult(jobId); } } 但是因为我只能提供一个Runnable来scheduleWithFixedDelay不能返回任何东西的scheduleWithFixedDelay ,所以我不明白future什么时候会完成。 调用future.get()甚至意味着什么? 我在等什么结果? 我第一次检测到远程任务已经完成,我想执行一个不同的远程调用并将其结果设置为future的值。 我想我可以使用CompletableFuture,我会转发到我的poll方法,然后将它转发到我最终完成它的retrieveTask方法: CompletableFuture result = new CompletableFuture(); ScheduledFuture future = executor.scheduleWithFixedDelay(() -> poll(jobId, result), 0, 10, TimeUnit.SECONDS); public void poll(String […]