Tag: multithreading

在Java中对volatile对象进行非易失性引用的行为

来自C / C ++,我对Java中的volatile对象行为有点困惑。 我知道Java中的volatile有两个属性: 不会将对象带入缓存,始终将其保存在主内存中。 保证“发生在之前” 但是我不确定如果我对对象进行新的非易失性引用会发生什么。 例如, class Example { private volatile Book b = null; public init() { b = new Book(…); } public use() { Book local = b; local.read(); } } AFAIK,volatile表示b引用的“book对象”应该在主内存中。 编译器可能在内部实现引用作为指针,因此b指针可能位于缓存中。 根据我的理解,volatile是对象的限定符,而不是引用/指针。 问题是:在use方法中,本地引用不是volatile。 这个“本地”引用是否会将基础Book对象从主内存带入缓存,从根本上使对象不“易变”?

Java Runnable Queue

我需要对下面的关键代码进行同行评审。 此类维护一个可运行的objets队列,并确保它们按顺序执行,即在前一个完成后启动一个新的,直到队列中不再有任务为止。 我很确定它确实如此,但我必须绝对确定它的行为是有意的。 非常感谢 ! public final class RunnableQueue { private final ExecutorService m_executorService; private final Queue m_runnables; private final Runnable m_loop; public RunnableQueue(ExecutorService executorService) { m_executorService = executorService; m_runnables = new LinkedList(); m_loop = new Runnable() { public void run() { Runnable l_runnable = current(); while(l_runnable != null) { l_runnable.run(); l_runnable = next(); } […]

multithreading排序算法

我必须在Java中为我的算法类实现multithreadingMerge Sort和Quick排序,并将它们与我的单线程版本进行比较。 但是,我以前从来没有multithreading。 代码我能够multithreading还是我必须重新开始? 这是我的单线程算法Merge Sort的代码。 sort()方法是我必须实现的策略模式的一部分。 @Override public int[] sort(int[] list) { int array_size = list.length; list = msort(list, 0, array_size-1); return list; } int[] msort(int numbers[], int left, int right) { int mid; if (left<right) { mid = (right + left) / 2; msort(numbers, left, mid); msort(numbers, mid+1, right); merge(numbers, left, mid, mid+1, […]

静态和非静态方法的同步块

我创建了两个线程并使用了一个类的实例,称为该对象的静态和非静态方法。 理想情况下,需要使用类名调用静态方法,我也这样做。 我在类的私有静态成员上同步静态和非静态方法,这些成员的线程正在调用它们的方法。 我注意到输出是同步的! 我的问题是: 静态方法如果使用synchronized块同步它通常需要类实例,那么它是如何接受静态对象的! 当调用静态方法的线程获取类级别锁定并且调用非静态方法的线程获取对象级别锁定时,输出如何同步! 即使我在基于对象的静态和非静态方法中都使用了synchronized块,它实际上也不应该同步; 或者是静态对象上的同步块的特殊情况? 请告诉我。 以下是我写的代码: public class StaticNonStaticSynch { public static void main(String[] args) { final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest(); Runnable runnable1 = new Runnable() { @Override public void run() { staticNonStaticTest.nonStaticMethod(); } }; Runnable runnable2 = new Runnable() { @Override public void run() { staticNonStaticTest.staticMethod(); } }; […]

如何在服务中检测长按音量键?

我想在服务中检测音量键中的长按。 以下是我的选择: A)让用户从锁定屏幕控制音量 在屏幕关闭时,我不想检测用户是否按下了服务中的音量按钮。 我已经尝试过(使用2天)使用contentObserver ,但问题是contentObserver检测到音量变化,并且当屏幕关闭时音量不会改变。 有什么方法可以让用户从锁定屏幕控制音量? B)从服务中检测长按音量按钮 我怎样才能做到这一点? 屏幕关闭时是否可以使用任何广播接收器? 有没有办法在服务中实现dispatchKeyEvent ? 我见过这个 ,但对我来说,第二个答案在后台不起作用。 我认为最简单的方法是选项A因为我已经为用户更改音量设置了所有内容,所以我可以让用户从锁定屏幕控制音量吗? 如果没有,还有什么我可以做的吗? 非常感谢, Ruchir

在等待之前释放锁定,然后重新获取锁定

在Java中,您可以将多个Condition对象关联到单个ReentrantLock 。 C#等价物是什么? 实际示例: Java Condition文档中的示例实现使用绑定到同一锁的两个Condition对象notFull和notFull 。 怎么可能将这个例子翻译成C#? 背景 :我经常发现Java代码使用两个Condition对象来表示与同一个Lock相关联的各种状态; 在C#中,似乎你也可以 调用Monitor.Enter一个对象,然后Monitor.WaitOne / Monitor.Pulse ,但这只是一个条件。 使用多个Auto/ManualResetEvent对象,但这些对象在等待后无法以primefaces方式重新获取给定的锁。 注意 :我可以想到一种方法:在单个对象上使用Monitor.WaitOne / Monitor.PulseAll ,并在唤醒后检查条件; 这就是你用Java做的事情,以防止虚假的唤醒。 但它并没有真正做到,因为它会强制你调用PulseAll而不是Pulse ,因为Pulse可能会唤醒一个等待另一个条件的线程。 不幸的是,使用PulseAll而不是Pulse会影响性能(线程竞争相同的锁)。

如何让我的程序每小时检查一次股票市值

我正在制定一个程序,以检查股票市场的符号,我做到了这一点,并添加了一个基本的gui。 我很困惑如何每小时检查一次,如果它增加则创建绿色向上箭头,如果减少则创建红色向下箭头。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class QuoteTracker { JFrame frame; JPanel mainPanel; JLabel enterLabel; JLabel resultLabel; JTextField text; JTextField result; JButton query; JButton redArrow; JButton greenArrow; String url; public static void main(String[] args) { new […]

java静态同步方法

当两个线程同时使用不同的实例调用静态同步方法时会发生什么? 可能吗? 对象锁用于非静态同步方法,但是什么类型的锁用于静态同步方法?

如何杀死不可中断的线程?

我们举办了一场AI编程竞赛,参赛者将使用我们提供的API编写在JVM上运行的AI 。 我们通过限制它们可以用SecurityManager做什么来将它们放入沙箱中,并且在运行时它们只是设置了几个标志,这是他们的决定。 我们的系统和他们的AI之间唯一的交互是通过这些标志,所以如果他们的线程突然死亡,对我们没有任何不良影响。 当AI计算时间太长时,我们想关闭他们的线程。 但是,我们无法找到保证我们将销毁其线程的方法。 一个可能的原因是AI进入无限循环而没有阻塞,使得Thread.interrupt()无用。 Thread.stop()是不可靠的,因为如果它们在try catch块中, ThreadDeathexception将被捕获,并且对我们没有任何问题,因为它们没有触及任何坏事,我们不关心它们是否死亡。 目前我们只是忽略他们的线程并在超时之后继续它们,但是它们的无限循环将继续在后台处理直到JVM死掉。 这对我们来说是不可接受的,因为我们将在24/7的Web服务器上在后台运行匹配,因此我们希望尽可能多的稳定性。 一种想法是在一个单独的JVM运行每个游戏,但这比我们想要的要复杂得多。 是否有任何确定的消防方法来摧毁线程?

最快的方法来初始化ConcurrentHashMap的值

ConcurrentHashMap通常在并发环境中用于在键下聚合某些事件 – 比如计算某些字符串值的命中。 如果我们事先不知道密钥,我们需要有一个很好的方法来初始化密钥的需要,它应该是快速和安全的并发性。 这个问题的最佳模式(就效率而言)是多少? 我将使用模型映射与声明如下: ConcurrentHashMap map = new ConcurrentHashMap(); 但它可能是一个包含任何键值对的映射,如果键中的键尚未存在,则需要初始化键值对,并将值状态变为记录事件。 有两种流行的方法:第一种使用ConcurrentHashMap.putIfAbsent : AtomicInteger count = map.get(s); if (count == null) { count = new AtomicInteger(0); AtomicInteger prevCount = map.putIfAbsent(s, count); if (prevCount != null) { count = prevCount; } } count.incrementAndGet(); 第二个使用ConcurrentHashMap.computeIfAbsent : AtomicInteger count = map.computeIfAbsent(s, (k) -> new AtomicInteger(0)); count.incrementAndGet(); 哪一个更适合这项任务? […]