Tag: multithreading

涉及Swing和AWT-EventQueue的无响应线程

我有一个没有响应的应用程序,似乎陷入僵局或类似僵局。 请参阅下面的两个主题。 请注意, My-Thread@101c线程阻止AWT-EventQueue-0@301 。 但是, My-Thread刚刚调用了java.awt.EventQueue.invokeAndWait() 。 所以AWT-EventQueue-0阻止My-Thread (我相信)。 My-Thread@101c, priority=5, in group ‘main’, status: ‘WAIT’ blocks AWT-EventQueue-0@301 at java.lang.Object.wait(Object.java:-1) at java.lang.Object.wait(Object.java:485) at java.awt.EventQueue.invokeAndWait(Unknown Source:-1) at javax.swing.SwingUtilities.invokeAndWait(Unknown Source:-1) at com.acme.ui.ViewBuilder.renderOnEDT(ViewBuilder.java:157) . . . at com.acme.util.Job.run(Job.java:425) at java.lang.Thread.run(Unknown Source:-1) AWT-EventQueue-0@301, priority=6, in group ‘main’, status: ‘MONITOR’ waiting for My-Thread@101c at com.acme.persistence.TransactionalSystemImpl.executeImpl(TransactionalSystemImpl.java:134) . . . at […]

从多个线程写入文本文件?

我有20个线程用println()函数写入一个名为results.txt的文件。 我如何同步它们? 我注意到每次运行程序时,我在results.txt中都有不同数量的文本行。 谢谢。

终于回来“发生了吗?”

我试图说服自己, finally子句中的操作发生在函数返回之前 (在内存一致性意义上)。 从JVM规范中可以清楚地看出,在一个线程中,程序顺序应该在关系之前驱动发生 – 如果在程序顺序中发生b则在 b 之前发生 。 但是,我还没有看到任何明确说明在返回之前最终发生的事情 ,那么它呢? 或者,编译器是否可以通过某种方式重新排序finally子句,因为它只是记录日志。 激励示例:我有一个线程从数据库中取出对象并将它们放入ArrayBlockingQueue,另一个线程将它们取出。 我有一些try – finally用于事件计时的块,我看到在log语句之前返回的影响 线程1: public Batch fetch() { try { log(“fetch()+”); return queryDatabase(); } finally { log(“fetch()-“); } … workQueue.put(fetch()); 线程2: log(“take()+”); Batch b = workQueue.take(); log(“take()-“); 令我惊讶的是,这是以意想不到的顺序打印出来的。 虽然,是的,不同线程中的日志记录语句可能无序出现,但存在至少20毫秒的时间差。 124 ms : take()+ 224 ms : fetch()+ 244 ms : take()- 254 […]

处理ThreadPoolExecutor的exception

我有以下代码片段,它基本上扫描需要执行的任务列表,然后将每个任务提供给执行程序执行。 JobExecutor反过来创建另一个执行程序(用于执行数据库内容…读取和写入数据到队列)并完成任务。 JobExecutor为提交的任务返回Future 。 当其中一个任务失败时,我想优雅地中断所有线程并通过捕获所有exception来关闭执行程序。 我需要做哪些改变? public class DataMovingClass { private static final AtomicInteger uniqueId = new AtomicInteger(0); private static final ThreadLocal uniqueNumber = new IDGenerator(); ThreadPoolExecutor threadPoolExecutor = null ; private List sources = new ArrayList(); private static class IDGenerator extends ThreadLocal { @Override public Integer get() { return uniqueId.incrementAndGet(); } } public void […]

如何设置log4j属性,以便每个线程输出到自己的日志文件?

我有任何给定时间运行的线程类的多个实例。 我有log4j设置用于日志记录需求。 我需要一种方法来设置log4j,以便我的线程类的每个实例在不同的日志文件中输出其日志。 这是我做的(伪代码) public class doSomething extends Thread { private Logger d_logger; public doSomething(int id){ d_logger = Logger.getLogger(“doSomething”+id); String logFileName = “doSomething”+id+”.log”; Properties prop = new Properties; prop.setProperty(“doSomething”+id,”DEBUG, WORKLOG”); prop.setProperty(“log4j.appender.WORKLOG”,”org.apache.log4j.FileAppender”); prop.setProperty(“log4j.appender.WORKLOG.File”, logFileName); prop.setProperty(“log4j.appender.WORKLOG.layout”,”org.apache.log4j.PatternLayout”); prop.setProperty(“log4j.appender.WORKLOG.layout.ConversionPattern”,”%d %c{1} – %m%n”); prop.setProperty(“log4j.appender.WORKLOG.Threshold”,”INFO”); PropertyConfigurator.configure(prop); } public void run(){ d_logger.info(“Starting to doSomething number” + id); } } 虽然上面为我实例化的每个线程创建了一个文件,但它不会向这些文件输出任何内容。 任何帮助深表感谢。

在Java中获得独有的系统范围锁定

我正在重新编写可以多次启动的Java可执行文件,我希望该过程一次完成一个。 在C#中,我会使用命名/系统Mutex执行此操作,但这在Java中似乎不可能。 我该如何实现此function?

如何调试ConcurrentModificationException?

我遇到了ConcurrentModificationException,通过查看它,我看不出它为什么会发生的原因; 抛出exception的区域和修改集合的所有位置都被包围 synchronized (this.locks.get(id)) { … } // locks is a HashMap; 我试图抓住讨厌的线程,但我所能指出的(通过在exception中设置断点)是抛出线程拥有监视器而另一个线程(程序中有两个线程)睡眠。 我该怎么办? 当遇到类似的线程问题时,您通常会做什么?

为什么wait / notify / notifyAll方法在java中不同步?

在Java中,每当我们需要调用wait / notify / notifyAll时,我们需要访问对象监视器(通过synchronized方法或通过synchronized块)。 所以我的问题是为什么java没有去同步等待/通知方法去除从同步块或方法调用这些方法的限制。 如果它们被声明为synchronized,它将自动获取监视器访问权限。

从大文件中逐个读取30Million用户ID

我正在尝试使用Java读取一个非常大的文件。 那个大文件会有这样的数据,这意味着每一行都有一个用户ID。 149905320 1165665384 66969324 886633368 1145241312 286585320 1008665352 在那个大文件中,将有大约3000万用户ID。 现在我试图从那个大文件中一个一个地读取所有用户id。 意味着每个用户ID应该只从该大文件中选择一次。 例如,如果我有30万个用户ID,那么它应该使用multithreading代码只打印一次3000万用户ID。 下面是我的代码,它是一个运行10个线程的multithreading代码,但是使用下面的程序,我无法确保每个用户ID只被选中一次。 public class ReadingFile { public static void main(String[] args) { // create thread pool with given size ExecutorService service = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { service.submit(new FileTask()); } } } class FileTask implements Runnable { […]

Java Concurrency in Practice – 示例14.12

// Not really how java.util.concurrent.Semaphore is implemented @ThreadSafe public class SemaphoreOnLock { private final Lock lock = new ReentrantLock(); // CONDITION PREDICATE: permitsAvailable (permits > 0) private final Condition permitsAvailable = lock.newCondition(); @GuardedBy(“lock”) private int permits; SemaphoreOnLock(int initialPermits) { lock.lock(); try { permits = initialPermits; } finally { lock.unlock(); } } /* other code omitted…. […]