Tag: multithreading

从java中的另一个线程访问线程的变量

我试图在java中的另一个线程中访问和修改线程的变量,我真的不知道如何做到这一点。 例如: Runnable r1 = new Runnable() { int value = 10; public void run() { // random stuff } } Runnable r2 = new Runnable() { public void run() { // of course the bellow line will not work r1.value–; // I want here to be able to decrement the variable “value” of r1 […]

使Swing组件同步

我正在阅读Java Threads 3rd Ed。 由奥克斯和黄(O’Reilly 2004)。 他们在整本书中都有一个Swing打字游戏的例子。 他们定义的类主要是javax.swing.JComponent自定义子类。 对我来说似乎完全错误的是,他们使用各种同步方法使这些JComponent的线程安全。 我的印象是Swing组件不应该是线程安全的,而是应该始终从Swing事件调度线程访问它们。 (有趣的是,他们通过Swing EDT修改组件的次数之一,它是一个setText ,这是很少有不需要从EDT调用的Swing方法之一。) 我想知道一些在编写/阅读Swing代码方面有很多经验的人:程序员是否常常使Swing组件同步而不是总是通过EDT修改它们? 它可以忍受吗? 编辑: 我注意到它和这个post几乎是同一个问题。 然而,它没有说明程序员在野外实际做了什么。 我很困惑,O’Reilly的书会如此公然违反Swing线程模型。 编辑: 我发现他们在本书的中间部分简要解释了Swing线程模型。 尽管如此,我想回答一下我的问题。 我觉得大多数读过这本书的人最终会违反Swing线程模型,因为他们的大部分例子都是如此。 编辑: 如果要查看代码,可以将示例代码作为zip文件下载 。 例如,参见ch03 / example1 / AnimatedCharacterDisplayCanvas。 编辑: 我刚刚了解到setText在Java7中不是线程安全的(2011年7月发布)。

当标志在不同的线程中更改时,循环没有结束

我在我的Java程序的main方法中运行了一个while循环。 循环应该运行,直到在程序的keyPressed方法中将布尔标志变量设置为true(我将程序作为KeyListener添加到JFrame)。 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class ThreadWhile implements KeyListener { private boolean flag = false; public static void main(String[] args) { //Set up key listening on a dummy JFrame JFrame frame = new JFrame(“Key Detector 9000”); frame.setVisible(true); ThreadWhile tw = new ThreadWhile(); frame.addKeyListener(tw); System.out.println(“Looping until flag becomes true…”); while(!tw.flag) { //Commenting […]

如何在运行时更改特定用户/线程的日志级别

我正在使用slf4j与log4j 2.0或logback作为实现。 例如,我的s​​ervlet有一个级别为ERROR的记录器,我的服务器产生了servlet的100个线程。 我将在运行时获得一个特殊用户列表。 当我检测到一些连接的特殊用户时。我想将这些特殊用户/线程的日志级别更改为DEBUG,并使其他线程的日志级别不受影响(仍然是ERROR)。 我知道logback中的TurboFilter和log4j 2.0中的DynamicThresholdFilter,但由于我只会在运行时获取特殊用户列表,所以我无法使用它们。 这是我的申请: package com.example.logging; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServlet; import org.slf4j.*; public class App extends HttpServlet { private final Logger Logger = LoggerFactory.getLogger(App.class); Map map = new HashMap(); public App() { map.put(“user1”, “DEBUG”); map.put(“user2”, “DEBUG”); map.put(“user3”, “ERROR”); } public void writeToLogFile(String userName) { if (map.containsKey(userName)) { // do […]

“同步”真的只是语法糖吗?

我是multithreading新手,我编写了这段代码,通过同时运行线程增量并打印变量来打印数字1-10000。 这是我正在使用的代码: package threadtest; public class Main{ static int i=0; static Object lock=new Object(); private static class Incrementer extends Thread{ @Override public void run(){ while (true){ synchronized(lock){ if (i>=10000) break; i++; System.out.println(i); } } } } public static void main(String[] args) { new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); new Incrementer().start(); } […]

ExecutorService,如何知道所有线程何时完成而不阻塞主线程?

我有一个multithreading实现,我创建一个ExecutorService并提交要执行的任务,我想知道所有线程被提交的时间已经完成而没有阻塞主线程和UI。 我已经尝试过ExecutorService.awaitTermination()但它阻止了主线程和UI。 我搜索了很多,但我似乎无法找到一种优雅的方式来做到这一点。 我正在考虑创建另一个线程来计算完成的线程数量,并在它们全部完成时启动一个事件,但这不是一个好方法,我想要一个更好的解决方案!

ruby线程编程,ruby相当于java wait / notify / notifyAll

我想知道ruby的Java方法的替代品是什么: 等待 通知 notifyAll的 你能发一个小片段或一些链接吗?

Swingmodal dialog拒绝关闭 – 有时!

// This is supposed to show a modal dialog and then hide it again. In practice, // this works about 75% of the time, and the other 25% of the time, the dialog // stays visible. // This is on Ubuntu 10.10, running: // OpenJDK Runtime Environment (IcedTea6 1.9) (6b20-1.9-0ubuntu1) // This always prints // […]

Java:线程生成器使用者等待生成数据的最有效方法是什么

使用BlockingQueue消耗生成的数据时,等待数据出现的最有效方法是什么? 场景: 步骤1)数据列表将是添加时间戳的数据存储。 这些时间戳需要按最接近当前时间优先级排序。 此列表可能为空。 线程将时间戳插入其中。 生产 步骤2)我想在另一个线程中使用此处的数据,该线程将从数据中获取时间戳并检查它们是否在当前时间之后。 消费者然后生产 步骤3)如果它们在当前时间之后,则将它们发送到另一个线程以供消费和处理。 在此处理时间戳数据后,从步骤1数据存储中删除。 消费然后编辑原始列表。 在下面的代码中,数据字段引用步骤1中的数据存储。结果是在当前时间之后发送的时间戳列表。 步骤2.然后将结果消耗在步骤3中。 private BlockingQueue data; private final LinkedBlockingQueue results = new LinkedBlockingQueue(); @Override public void run() { while (!data.isEmpty()) { for (LocalTime dataTime : data) { if (new LocalTime().isAfter(dataTime)) { results.put(result); } } } } 问题等待数据列表中可能可能为空的数据的最有效方法是什么? 专注于: while (!data.isEmpty()) 从之前的问题开始。

如何中断IMAP的IDLE?

我正在使用连接到我的IMAP服务器的Javamail API。 使用javax.mail.Folder.idle() 方法,一切都运行良好。 当有新邮件进入时,我的监听器会被调用。但问题是永远是空闲块,我该如何打断它? 如何在不杀死Java程序的情况下实际停止监听? 我试过在idle’d线程上调用Thread.interrupt()。 什么都没发生。 我的想法已经不多了。