Tag: multithreading

Kinesis:关闭工人的最佳/安全方法是什么?

我正在使用AWS Kinesis客户端库 。 我需要一种方法在部署期间关闭Kinesis Worker线程,这样我就停在检查点而不是在processRecords()的中间。 我在Worker.java看到了一个关闭boolean,但它是私有的。 我需要的原因是检查点和幂等性对我来说至关重要,我不想在批处理中间杀死进程。 [编辑] 感谢@CaptainMurphy,我注意到Worker.java公开了shutdown()方法,它安全地关闭了worker和LeaseCoordinator 。 它没有做的是在IRecordProcessor调用shutdown()任务。 它突然终止了IRecordProcessor而不用担心状态。 我确实理解KCL不保证检查点之间的幂等性,并且开发人员应该使设计容错,但我觉得在LeaseCoordinator停止之前, IRecordProcessor应该正确关闭, LeaseCoordinator 。

这段代码是线程安全的吗?

我想处理客户端请求流。 每个请求都有其特殊类型。 首先,我需要初始化该类型的一些数据,然后我可以开始处理请求。 当客户端类型第一次出现时,我只是初始化相应的数据。 在此之后,使用该数据处理该类型的所有以下请求。 我需要以线程安全的方式执行此操作。 这是我写的代码。 它是线程安全的吗? public class Test { private static Map clientTypesInitiated = new ConcurrentHashMap(); /* to process client request we need to create corresponding client type data. on the first signal we create that data, on the second – we process the request*/ void onClientRequestReceived(int clientTypeIndex) { if (clientTypesInitiated.put(clientTypeIndex, “”) […]

线程在同步块内崩溃时锁定会发生什么?

让我们说Thread-1在对象上同步 synchronize(object){ //statement1 //statement2 //statement3 } 如果Thread-1在statement2上崩溃,对象上的锁会发生什么,当发生这种情况时,JVM会自动释放Thread-1上的锁吗? 因为否则如果Thread-2正在为要释放的对象锁定并且Thread-1崩溃,则Thread-2将永远等待。

DelegatingVehicleTracker(第65页Goetz)如何返回“实时”视图?

在Java Concurrency in Practice的第65和66页上,Brian Goetz列出了以下代码: @ThreadSafe public class DelegatingVehicleTracker { private final ConcurrentMap locations; private final Map unmodifiableMap; public DelegatingVehicleTracker(Map points) { locations = new ConcurrentHashMap(points); unmodifiableMap = Collections.unmodifiableMap(locations); } public Map getLocations() { return unmodifiableMap; } public Point getLocation(String id) { return locations.get(id); } public void setLocation(String id, int x, int y) { if […]

Java中的LRU缓存实现

我已经看到了以下代码,我认为在addElement方法的实现中有一个无用的while循环。 它应该永远不会出现比size + 1更多的元素,因为已经存在写锁定。 那么为什么addElement方法会删除元素,直到它得到这个条件为真 while(concurrentLinkedQueue.size() >=maxSize) 围绕这个的任何指针都会很棒。 这是实施: public class LRUCache { private ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(); private ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private Lock readLock = readWriteLock.readLock(); private Lock writeLock = readWriteLock.writeLock(); int maxSize=0; public LRUCache(final int MAX_SIZE){ this.maxSize=MAX_SIZE; } public V getElement(K key){ readLock.lock(); try […]

我如何使用Javamultithreading从多个文件中读取?

我想阅读并解析很多文件。 由于有超过10000个文件需要解析,我想通过使用线程来加快这个过程。 例如,如果我有5个线程,我想让它们同时读取一定数量的文件,这样读取和解析的过程就会更快。 这可能吗? 通过将其分成线程,我可以获得任何显着的加速吗? 如果是这样,我该怎么做? PS我不反对使用外部库。 我正在使用jdk 1.6

ReentrantLock用例

我在Java的MultiThreading概念方面很差。 我正在通过ReentrantLockfunction和用法。 我得到它更灵活然后同步并添加更多function。 我可以看到它上面提到的例子,我做得很好。 我无法弄清楚它在商业中有用的实时场景。 我可以看到最好避免死锁。 有人可以提供没有ReentrantLock的用例,很难解决这种用例。 或者可以指向某些链接会有所帮助。

并行化快速排序使其变慢

我正在快速搜索大量数据,为了获得乐趣,我尝试将其并行化以加快排序速度。 但是,在它的当前forms中,由于同步阻塞点,multithreading版本比单线程版本慢。 每次我生成一个线程时,我都会对一个int进行锁定并递增它,并且每次线程完成时我都会再次获得锁定和减少,此外还要检查是否还有任何线程仍在运行(int> 0)。 如果没有,我唤醒我的主线程并使用已排序的数据。 我相信有更好的方法可以做到这一点。 不知道它是什么。 非常感谢帮助。 编辑:我想我没有提供足够的信息。 这是octo-core Opteron上的Java代码。 我无法切换语言。 我正在排序的数量适合内存,并且在调用quicksort时它已经存在于内存中,因此没有理由将其写入磁盘只是将其读回内存。 通过“获取锁定”我的意思是在整数上有一个同步块。

如何暂停所有正在运行的线程? 然后恢复?

我已经看到了这个问题 : 如何暂停然后恢复一个post? 我在stackoverflow中看到了很多与我的问题有关的问题,但是我无法理解它们,因为它们是抽象的,而且不够具体到我的情境。 有2个倒计时标签。 单击“ Start Button ,将执行倒计时。 以同样的方式,当您单击“ Pause Button ,它应该暂停。 但是,我收到一个错误: Exception in thread “AWT-EventQueue-0” java.lang.IllegalMonitorStateException 2线程已启动,但我无法使用wait()方法停止它。 请让我知道如何停止线程,并实现resume按钮。 谢谢。 简单的例子如下 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; class FirstCountDown extends SwingWorker { public Integer doInBackground() { for(int i=0; i<1000; i++){ CountDown.count1.setText(String.valueOf(1000-i)); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO […]

一次可以在CPU上运行多少个线程

我想知道同一个应用程序可以在CPU上运行多少个线程? 我同样简单的喜欢: import java.awt.SystemColor; import java.util.Date; public class Threadcall { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here System.out.println(“————————–“); System.out.println(Runtime.getRuntime().availableProcessors()); System.out.println(“————————–“); for (int i = 0; i 0; i–) { System.out.println(“Main Thread: ” + i + “\t” + new Date()); Thread.sleep(1000); } […]