Tag: 并发

为什么java.util.concurrent.ArrayBlockingQueue使用’while’循环而不是’if’来调用await()?

我一直在玩我自己的版本,使用’if’,似乎一切正常。 当然,如果使用signalAll()而不是signal(),这将会崩溃,但如果一次只通知一个线程,那怎么会出错呢? 他们的代码在这里 – 检查put()和take()方法; 可以在JavaDoc for Condition的顶部看到更简单,更多点的实现。 我的实施的相关部分如下。 public Object get() { lock.lock(); try { if( items.size() = capacity ) hasSpace.await(); items.addFirst(item); hasItems.signal(); return; } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } PS我知道,一般来说,特别是在像这样的lib类中,应该让exception渗透。

设置线程池的理想大小

有什么区别 – newSingleThreadExecutor vs newFixedThreadPool(20) 从操作系统和编程的角度来看。 每当我使用newSingleThreadExecutor运行程序时,我的程序运行良好,端到端延迟(第95百分位数)大约需要5ms 。 但是一旦我开始运行我的程序 – newFixedThreadPool(20) 我的程序性能下降,我开始看到端到端延迟为37ms 。 所以现在我试图从架构的角度来理解这里有多少线程意味着什么? 以及如何确定我应该选择的最佳线程数? 如果我使用更多的线程,那会发生什么? 如果有人能用外行语言向我解释这些简单的事情那么这对我来说非常有用。 谢谢您的帮助。 我的机器配置规范 – 我正在从Linux机器运行我的程序 – processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 45 model name : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz stepping : 7 cpu MHz : 2599.999 cache size : […]

为什么Thread.isInterrupted()总是返回false?

我找到了JavaDoc的方法: 返回:如果此线程已被中断,则返回true; 否则是假的。 我认为我对该方法的理解有些不对劲。 此外,我可能会误解Thread中的“中断”概念。 欢迎任何解释! 谢谢! 代码段: 在线程定义中: public void run() { try { //Do something } catch (InterruptedException e) { System.out.println(isInterrupted());//Always false return; } } 引用: theThread.interrupt();

`this`如何通过发布内部类实例引用外部类转义?

之前的问题略有不同, 但要求是/否答案,但我正在寻找书中遗漏的解释(Java Concurrency in Practice),这个明显的大错误将如何被恶意或意外地利用。 可以发布对象或其内部状态的最终机制是发布内部类实例,如清单3.7中的ThisEscape所示。 当ThisEscape发布EventListener时,它也隐式发布封闭的ThisEscape实例,因为内部类实例包含对封闭实例的隐藏引用 。 清单3.7。 隐式允许此引用转义。 不要这样做。 public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent(Event e) { doSomething(e); } }); } } 3.2.1。 安全施工实践 ThisEscape说明了一个重要的特殊情况 – 当它在构造过程中引用转义时。 发布内部EventListener实例时,封闭的ThisEscape实例也是如此。 但是,只有在构造函数返回后,对象才处于可预测的一致状态,因此从构造函数中发布对象可以发布未完全构造的对象。 即使发布是构造函数中的最后一个语句,也是如此。 如果此参考在施工期间逃逸,则认为该物体构造不当。[8] [8]更具体地说,在构造函数返回之前,此引用不应从线程中转义。 这个引用可以由构造函数存储在某处,只要它在构造之后不被另一个线程使用。 清单3.8中的SafeListener使用了这种技术。 在施工期间不要让此参考物逃逸。 在完成构建之前,有人会如何编写代码来到OuterClass? 在第一段中用斜体字提到的hidden inner class reference是什么?

Java套接字swingWorker正在运行但没有收到或传输消息

几天前,我试图创建一个服务器 – 客户端或客户端服务器作为实验来了解使用线程的套接字,但后来有人告诉我应该使用swingWorker。 我做了一些研究如何使用并在实践中实现它但它仍然无效。 swingWorker线程看起来不像它正在运行,即使我得到一个连接并使用.excute()。 如果你们可以帮助发现我做错了哪个会很棒。 SwingWorker类位于startSever()和startClient()方法中。 private void startServer() { SwingWorker runningServer = new SwingWorker(){ protected Void doInBackground() { try { listeningSocket = new ServerSocket(port); System.out.println(“waiting for connection”); connection = listeningSocket.accept(); connected = true; System.out.println(“Connected”); String incomeMessage =null; while(connected){ inStream = connection.getInputStream(); inDataStream = new DataInputStream(inStream); if (myMessage !=null){ outStream = connection.getOutputStream(); outDataStream = […]

Javafx:javafx.concurent和Platform.runLater之间的区别?

我很好奇javafx.concurent和Platform.runLater之间在multithreadingJavaFx编程方面究竟有什么区别。 这是否意味着使用javafx.concurrent,我们可以拥有多个实际的绘图线程,或者它们最终都会在一个线程上结束? 我喜欢的一件事是使用JavafX并同时摆动,因为它们都使用了2个不同的绘图线程。 我会使用swing来处理繁重的内容(例如打开FileChooser)并使用JavaFX作为核心可视化内容,例如播放无缝的循环video。 然而,由于无头的exception错误,mac使得这一切变得不可能,所以一切都落在javafx上,这意味着在打开文件追踪器等事情时会有很多停顿。 如果我使用javafx.concurrent重写我的应用程序,我是否可以像使用Swing + JavaFX那样模仿2绘制线程体验?

Java:如何使用Thread.join

我是线程的新手。 我如何让t.join工作,调用它的线程等到t执行t.join ? 这段代码只会冻结程序,因为线程正在等待自己死掉,对吧? public static void main(String[] args) throws InterruptedException { Thread t0 = new Thready(); t0.start(); } @Override public void run() { for (String s : info) { try { join(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf(“%s %s%n”, getName(), s); } } 如果我想要两个线程,我会怎么做,其中一个打印出info数组的一半,然后在完成其余操作之前等待另一个完成?

使用runnable的相同实例初始化两个线程

使用相同的runnable实例初始化两个线程是不是很糟糕的编程? 使用runnable的单独实例进行初始化会有什么不同,并且对于runnable的同一实例共享内存位置与性能有什么关系? public static void main(String[] args)throws Exception { H h = new H(); H h2 = new H(); Thread j = new Thread(h); j.setName(“11”); Thread jj = new Thread(h);//instead of new H() jj.setName(“22”); j.start(); jj.start(); } class H implements Runnable { public void run() { while(true) { System.out.println(Thread.currentThread().getName()); } } }

Java并发:是最终字段(在构造函数中初始化)是线程安全的吗?

谁能告诉我这个类是否是线程安全的? class Foo { private final Map aMap; public Foo() { aMap = new HashMap(); aMap.put(“1”, “a”); aMap.put(“2”, “b”); aMap.put(“3”, “c”); } public String get(String key) { return aMap.get(key); } } 编辑:我不能澄清这个问题。 根据JMM FAQ : 应提供初始化安全性的新保证。 如果正确构造了一个对象(这意味着对它的引用在构造期间不会被转义),那么看到对该对象的引用的所有线程也将看到在构造函数中设置的最终字段的值,而不需要同步。 这让我感到困惑的是,set到aMap是aMap = new HashMap(); 。 所以其他线程可以看到这些 aMap.put(“1”, “a”); aMap.put(“2”, “b”); aMap.put(“3”, “c”); 或不 ? 编辑:我发现这个问题与我的问题完全不同

Java中的构造函数同步

有人告诉我,Java构造函数是同步的,因此在构造期间无法同时访问它,我想知道:如果我有一个构造函数将对象存储在一个映射中,另一个线程在构造之前从该映射中检索它完成后,该线程会阻塞直到构造函数完成吗? 让我演示一些代码: public class Test { private static final Map testsById = Collections.synchronizedMap(new HashMap()); private static final AtomicInteger atomicIdGenerator = new AtomicInteger(); private final int id; public Test() { this.id = atomicIdGenerator.getAndIncrement(); testsById.put(this.id, this); // Some lengthy operation to fully initialize this object } public static Test getTestById(int id) { return testsById.get(id); } } 假设put […]