Tag: multithreading

JavaFX UI冻结问题

我试图显示每项任务的进度和状态。 每个任务一行代表TableView 。 每个任务在每个Thread执行并行执行。 请参考TableView图片。 对于“Progress” TableColumn我将Cell Factory设置为渲染“ProgressBar”。 public static class ProgressBarTableCell extends TableCell { private final ProgressBar progressBar; private ObservableValue ov; public ProgressBarTableCell() { this.progressBar = new ProgressBar(); progressBar.setPrefHeight(23); setAlignment(Pos.CENTER); } @Override public void updateItem(T item, boolean empty) { super.updateItem(item, empty); if (item == null) { setGraphic(null); setText(null); } else { if (item.toString().equalsIgnoreCase(“Processing”)) { […]

在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行`mappingFunction`

我正在尝试查看实际的Java文档,该文档描述了在传递给ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent方法时可以调用mappingFunction次数。 ConcurrentHashMap.computeIfAbsent的Javadoc似乎很清楚,表示mappingFunction最多只执行一次: ConcurrentHashMap.computeIfAbsent Javadoc 如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为null。 整个方法调用是以primefaces方式执行的, 因此每个键最多应用一次该函数 。 其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射。 但是ConcurrentHashMap.computeIfPresent的Javadoc没有说明可以执行mappingFunction次数: ConcurrentHashMap.computeIfPresent Javadoc 如果存在指定键的值,则尝试在给定键及其当前映射值的情况下计算新映射。 整个方法调用以primefaces方式执行。 其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射。 通过查看源代码,他们看起来就像mappingFunction最多只执行一次。 但我真的希望看到保证这种行为的实际文档。 有这样的文件吗?

Collections.synchronizedlist()从end 迭代时删除元素

我正在使用Collections.Synchronizedlist()来使我的arraylist线程安全。 我想问的是以下代码线程安全,即从末尾迭代列表时删除: – pendingExecutionList = Collections.synchronizedList(new ArrayList(initialCapacity)); 我在主线程中创建列表。 并从不同的线程添加到此列表。 但是,迭代和删除只能从一个Scheduled线程完成,如下所示: – for (int i = pendingExecutionList.size() – 1; i >= 0; i–) { if (someCondition(pendingExecutionList.get(i))) { process(pendingExecutionList.remove(i)); } } 当多个线程添加到此列表时,上述代码仅由单个线程执行。 我想避免在synchronized(list)使用迭代器,因为它不是故障安全的。

OpenJDK JVM不会在多个核心上调度线程

当我在随Ubuntu 12.04一起分发的OpenJDK 6 JVM上运行我的multithreadingJava程序时,所有线程都安排在一个内核上。 但是当我从Oracle最新的1.7 JDK在JVM上运行完全相同的程序时,它很好地围绕所有24个可用内核旋转了我的20个线程。 OpenJDK文档解释了Java线程将被分配给本机线程,但它似乎不起作用。 我的OpenJDK安装中是否存在配置错误,或者它是否真的不支持多核硬件? OpenJDK的: java version “1.6.0_27” OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2) OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) Oracle JDK: java version “1.7.0_40” Java(TM) SE Runtime Environment (build 1.7.0_40-b43) Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

如果线程已被中断,Thread.sleep会抛出吗?

给定一个在没有被阻塞的情况下被中断的线程(即没有抛出InterruptedException),该线程在以后尝试睡眠时是否会抛出InterruptedException? 文档没有明确说明: InterruptedException – 如果有任何线程中断了当前线程。 抛出此exception时,将清除当前线程的中断状态。

Android从服务器下载图像并保存到SD卡而不使用BitmapFactory

我正在尝试创建一个用于从服务器下载图像并将其显示到listview的应用程序。 我做的问题是内存泄漏并使我的应用程序崩溃。 我在Android博客中搜索此链接 ,它显示了一个好主意,但仍然不足以用多个线程来做。 android的某些设备可以使用它,但有些设备只能在单个线程中处理,有时它根本无法工作。 我的应用程序有很多活动,每个活动都有一个Listview,需要尽可能快地显示图像。 通过Google IO 2012,他们使用缓冲区将原始图像保存到SD卡,它解决了泄漏内存的问题,但由于需要下载的图像太大,导致加载速度变慢。 我的问题是: 有没有办法将图像与写入SD卡一起缩放? 我想出一些可能的解决方案是在输入流对象中使用跳过字节,我能够找到Width和Height以及我需要下载的图像的每像素位数。 以下代码在Google IO 2012中使用,它适用于multithreading,在我的情况下,我有4个线程在后台运行。 private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError { BufferedOutputStream out = null; try { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setDoInput(true); conn.connect(); final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES); // buffer size 1KB out = new BufferedOutputStream(new […]

使用私有构造函数扩展类的技术

与大多数Singleton类一样,是否存在使用私有构造函数“扩展”类的标准技术? 具体来说,我正在尝试扩展java.lang.management.ThreadInfo类,因为我将很多它们添加到HashSet来控制唯一性。 但是,我确定两个线程是否相等的方式是不同的,并且与equals()方法的默认实现不同。 在这种情况下,扩展类显然不是一个选项。 制作类似于在构造函数中接受ThreadInfo的包装类,然后使用值手动填充所有相关字段,然后覆盖equals()和hashCode() ,或者有更好的方法来执行此操作是否合理? 像我这样的东西就是我开始写的,但更好的实现是理想的: class ThreadInfoWrapper { private ThreadInfo info; ThreadInfoWrapper(ThreadInfo info) { this.info = info; } //Populate instance variables with Thread.State, thread ID, etc.. with //Getters/setters and all that other stuff public boolean equals(Object o) { //Unique implementation } public int hashCode() { //Whatever implementation } } 但这感觉就像是一种非常迂回的方式来实现一些基本function。 我调查了一下,Java标准库中不存在使用自定义比较器的集合的实现。 我想我可以编写自己的哈希集实现,但这对于一个简单的情况来说太过分了。 任何见解都会有所帮助。

Java线程Random.nextLong()返回相同的数字

我正在使用OAuth库来调用新的Random()。nextLong()来生成随机数,但是它会在异步调用中生成相同的随机数。 我已经将它缩小到线程化以使Random.nextLong()每隔一段时间返回相同的确切数字。 有谁知道这是否是Java的已知限制? 如果是这样,有没有人知道线程安全操作? 编辑:我正在使用Java 1.6 编辑:这是我用来测试我的大型应用程序中发生的事情的一个小程序。 我跑了几次,而且经常应该这样,当时间相同时,它会出现相同的随机数。 请原谅我的快速编程。 public class ThreadedRandom { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new ThreadedRandom().run(); } private RandomNumberGenerator _generator; public ThreadedRandom() { _generator = new RandomNumberGenerator(); } public void run() { Runnable r = new Runnable() { @Override public […]

是否有任何框架用于处理swing应用程序中的数据库请求?

我相信任何在gui应用程序中处理数据库请求的程序员都遇到了以下部分或全部问题: 您的GUI冻结是因为您从事件调度线程中调用数据库层 如果有多个窗口/面板/ jframe,用户可以在其中启动数据库请求,则性能会下降,因为您无法控制用户创建的线程 用户可能能够锁定应用程序甚至数据库,因为他在第一个操作完成之前多次调用任何操作 我想知道的是:是否有任何框架可以处理在事件调度线程之外处理一组有序的长时间运行操作(包括但不限于数据库调用,即计算)的要求? 注意:我知道SwingWorker 😉

转换wait&notifyAll代码以使用Java 1.5 Lock对象

我们使用在代码段周围使用同步块的代码,需要大量的wait和notifyAll()调用。 我们正在尝试将这些转换为使用Java 5 Lock.lock()和Lock.unlock()方法。 如何迁移此代码以删除所有wait和notifyAll调用。 我不知道使用新的锁定function相当于这些。 任何与示例的链接将不胜感激。 提前致谢 方程式,下面的代码需要转换为使用Lock.lock()和lock.unlock删除synchronized块的第一部分很简单,因为我只需要调用lock()方法。 问题是可以为notifyAll()和wait方法做些什么。 同步(LOCK) { while(!Thread.interrupted()) { 尝试 { working = runRules(); 如果(!工作) LOCK.notifyAll(); LOCK.wait(工作?shortTimeout:longTimeout); } catch(最终InterruptedException e) { Package.log.info(“线程被中断。退出。”,e); 返回; } } }