Tag: concurrency

从runnable更新GUI

我正在构建一个Swing应用程序,其中一部分function应该是直观地和可听地处理和输出一些文本(使用Mary TTS)。 我需要一些关于GUI和文本处理类进行通信的最佳方法的建议。 GUI类是JPanel的子类。 在其中我有一个实现Runnable的类,名为LineProcesser,它准备将文本分派给音频播放器。 我正在使用一个线程执行器来阻止它离开EDT(这可能不是最好的方法,但它似乎达到了我所追求的结果)。 我的目的是让LineProcessor运行所有文本并在每行末尾更新JTextArea。 此外,它需要在某些点停止并等待用户输入。 用户输入完成后,GUI类应该告诉它继续处理。 以下代码说明了我目前拥有的内容: public class MyPanel extends JPanel { ExecutorService lineExecutor = Executors.newSingleThreadExecutor(); Runnable lineProcessor = new LineProcessor(); public class LineProcessor implements Runnable { private int currentLineNo = 0; public LineProcessor() { // … } @Override public void run() { // call getText(); // call playAudio(); currentLineNo++; } […]

JProgressBar setValue不起作用,也尝试使用SwingUtilities

我在JTable中实现了一个JProgressBar。 我使用渲染器作为ProgressBar NOT EDITOR。 现在我尝试实现一个ProgressBar设置值,但由于EDT它没有工作,所以我使用了SwingUtilties,但它没有用。 预期行为 – JProgressBar必须将值设置为80,目前它只显示0% public class SkillSetTableProgressBarRenderer extends JProgressBar implements TableCellRenderer { public SkillSetTableProgressBarRenderer() { super(0, 100); super.setPreferredSize(new Dimension(100, 80)); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final JProgressBar bar = (JProgressBar) value; if (bar.getString().equals(“JAVA”) || bar.getString().equals(“SWING”)) super.setString(“Mellow”); else super.setString(“GOOD”); setOpaque(true); […]

为什么我的JTextArea没有更新?

我的代码如下: class SimplifiedClass extends JApplet { private JTextArea outputText; // Lots of methods public void DoEverything() { String output = “”; for(int i = 0; i <= 10; i++) { output += TaskObject.someLongTask(i); outputText.setText(output); } } } 但是,当调用setText时,不是在循环的每次迭代之后更新文本区域,而是在完成任务的所有运行时它似乎仅更新文本。 为什么会发生这种情况,我该如何解决?

Java 8流是primefaces的吗?

我读了几篇文章,然而,我仍然感到困惑。 我知道并行流将以并行方式执行,这将利用CPU。 我认为子作业将作为primefaces单位执行,我是否正确? 但是常规的Java 8流呢? 如果我执行让我们说下一行代码: users.stream().map(user->user.getUsername()).collect(Collectors.toList()); 该行是否也将以线程安全/primefaces方式执行?

Collectors.joining(“,”)线程安全吗?

java.util.stream.Collectors::joining实现是否是线程安全的? 我能做点什么吗 public final class SomeClass { private static final Collector jc = Collectors.joining(“,”); public String someMethod(List someList) { return someList.parallelStream().collect(jc); } } 不用担心遇到并发问题?

ConcurrentHashMap jdk 8使用TreeNodes而不是List ..为什么?

嗨,我知道在JDK 8之前ConcurrentHashMap的工作方式。我也理解了代码:它非常模块化,不太难理解。 JDK 8中的ConcurrentHashMap代码与之前的实现相比发生了很大变化。 因为这个问题被归类为过于宽泛,我现在会尝试非常具体。 CHMv8使用TreeBin(RedBlackTree的变体)来存储桶而不是链表。 所以我的问题是在链表上使用TreeBin的主要优势是什么? 源代码在这里

是否使用invokeAll或submit – java Executor服务

我有一个场景,我必须为同一个callable异步执行5个线程。 据我了解,有两种选择: 1)使用submit(Callable) ExecutorService executorService = Executors.newFixedThreadPool(5); List<Future> futures = new ArrayList(); for(Callable callableItem: myCallableList){ futures.add(executorService.submit(callableItem)); } 2)使用invokeAll(Callable集合) ExecutorService executorService = Executors.newFixedThreadPool(5); List<Future> futures = executorService.invokeAll(myCallableList)); 应该是什么首选方式? 与其他产品相比,它们中的任何产品是否存在任何劣势或性能影响?

使用ConcurrentHashMap,何时需要同步?

我有一个ConcurrentHashMap,我在其中执行以下操作: sequences = new ConcurrentHashMap<Class, AtomicLong>(); if(!sequences.containsKey(table)) { synchronized (sequences) { if(!sequences.containsKey(table)) initializeHashMapKeyValue(table); } } 我的问题是 – 是否没有必要额外做 if(!sequences.containsKey(table)) 检查synschronized块内部,以便其他线程不会初始化相同的hashmap值? 也许检查是必要的,我做错了? 我正在做的事似乎有点傻,但我认为这是必要的。

完成所有ExecutorService任务后,程序不会立即终止

我将一堆可运行的对象放入ExecutorService: // simplified content of main method ExecutorService threadPool = Executors.newCachedThreadPool(); for(int i = 0; i < workerCount; i++) { threadPool.execute(new Worker()); } 我希望我的程序/流程在所有工人完成后立即停止。 但根据我的日志,它需要另外20-30秒才能发生。 工人们没有分配任何资源,事实上,他们现在什么都不做。 不要误会我的意思,这对我来说不是一个至关重要的问题,我只是想了解发生了什么,我想知道这是否是正常行为。

Java执行程序:等待任务终止。

我需要提交一些任务,然后等待所有结果,直到所有结果都可用。 它们中的每一个都向Vector添加一个String (默认情况下是同步的)。 然后我需要为Vector中的每个结果启动一个新任务,但是只有当所有先前的任务都停止完成它们的工作时我才需要这样做。 我想使用Java Executor,特别是我尝试使用Executors.newFixedThreadPool(100)来使用固定数量的线程(我有一个可变数量的任务,可以是10或500)但我是执行器和我不知道如何等待任务终止。 这就像我的程序需要做的伪代码: ExecutorService e = Executors.newFixedThreadPool(100); while(true){ /*do something*/ for(…){ } for each String in result{ } } 我不能做e.shutdown,因为我有一段时间(真的)我需要重用executorService … 你能帮助我吗? 你能给我一个关于java执行器的指南/书吗?