Tag: 并发编程

LinkedBlockingQueue和ConcurrentLinkedQueue之间有什么不同?

我已经阅读了博客,但我不确定他的结论是否正确: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html#ixzz1seaiSLwp 他说: 从提供的性能结果可以看出,LinkedBlockingQueue实现了最佳的组合(添加和删除元素)性能结果,应该是实现生产者 – 消费者schenarios的头号候选者。 我想知道,如果我不在我的代码中使用锁,那么它不会更快吗? 那么为什么LinkedBlockingQueue比无锁队列(ConcurrentLinkedQueue)更快? 谢谢 !

启动/暂停/恢复/暂停…由其他类调用的方法

我想实现一个Anytime k-NN分类器,但我找不到一种方法来调用“classify(…)”方法一段特定的时间,暂停它,在方法暂停之前获取可用的结果,恢复特定时间的方法,暂停它,在方法暂停之前获得可用的结果,等等…我使用数据结构来获得近似结果。 当算法遍历数据结构时,它最终会遇到实际的训练数据向量。 public class AnytimeKNN{ public int classify(queryPoint, k){ class_label; 1. Assign an initial value to ‘class_label’. 2.while(not actual training data vectors are encountered){ 1. traverse the data structure 2. assign a new value to ‘class_label’ } } } 我想以下列方式从main方法调用’classify(..)’方法: 启动方法’classify(..)’ 当分配初始值为’class_label’时,暂停方法’classify(..)’。 获取初始标签 在X时间内继续使用方法’classify(..)’ 暂停方法’classify(..)’ 获取新的“class_label” 恢复方法’分类(..)’的X时间等等…… 提前致谢!

如何使用其他Java程序停止运行程序

我一直在实现一个程序来编译和运行其他应用程序。 当我的应用程序发现存在例如无限循环的问题时,我想知道是否有办法终止程序。 我试图使用process.Destroy()但它杀死CMD而不是那个有无限循环的实际程序… 非常感谢您的帮助。 这是我的代码的一部分: synchronized (pro) { pro.wait(30000); } try{ pro.exitValue(); }catch (IllegalThreadStateException ex) { pro.destroy(); timeLimitExceededflag = true; System.out.println(“NOT FINISHED123”); System.exit(0); } } 基本上我正在使用processBuilder来调用cmd。 此代码终止CMD,但如果它运行的程序具有无限循环,则应用程序仍将运行,这会影响我的服务器性能。

如何使用java并发编程的ExecutorService?

我使用下面的代码在远程服务器上上传图像。当我在下面使用时,它会在远程服务器上并行上传所有图像。 List<Future> futureList = new ArrayList<Future>(); ExecutorService execService = Executors.newFixedThreadPool(Images.size()); for (IImage image : Images) { try { //execService.execute(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName())); singleFuture = execService.submit(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName())); //Log.d(“”,”singleFuture ——-“+singleFuture.get()); futureList.add(singleFuture); Log.d(“”,”futureList Size:”+futureList.size()); } catch(Exception e){ execService.shutdown(); } 每当我使用下面的代码 singleFuture = execService.submit(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName())); //Log.d(“”,”singleFuture ——-“+singleFuture.get()); futureList.add(singleFuture); 将所有未来对象添加到futurelist中,立即从runnable返回(不等待runnable直到完成所有图像的上传(后台上传处理正在进行) 但每当我在上面的代码中取消注释时,在成功上传每个图像后,它将从runnable返回。 singleFuture = execService.submit(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName())); Log.d(“”,”singleFuture ——-“+singleFuture.get()); futureList.add(singleFuture); 我的代码是否有任何问题,是否可以一次更多地连接远程服务器或服务器上的任何负载?如何使用并发编程java上传图像?请给我们指导? submit()和execute()函数是否具有相同的效果?

阻止锁定与非阻止锁定

我在这里想:如果你有2个线程执行需要同步的FAST操作,那么阻塞/上下文切换方法不是更快/更好的非阻塞方法吗? 通过非阻塞我的意思是: while(true){if(checkAndGetTheLock())break; } 我唯一能想到的是饥饿(CPU烧坏),如果你有太多的线程在锁定周围循环。 如何平衡一种方法与另一种方法?

ConcurrentHashMap返回一个弱一致的迭代器,为什么我们应该使用它呢?

我正在阅读Java Concurrecny这本书。 在第85页的第5.2.1节中,它讨论了ConcurrentHashMap及其优点。 然而,在一部分中,书籍声称 ConcurrentHashMap返回的迭代器非常一致。 这意味着这个迭代器可以容忍并发修改,遍历构造迭代器时存在的元素,并且可以(但不保证)反映迭代器构造后对集合的修改。 从我理解为什么并发程序中的整个同步点是允许线程以一致的方式访问共享资源,而ConcurrentHashMap并没有真正实现这一点。 那么为什么要使用呢?

C / C ++和C#/ Java之间使用volatile的区别是什么?

我在许多参考文献中发现它提到C / C ++中的volatile很弱并且可能在多处理器的并发环境中引起问题,但它( volatile )可以用作C#/ Java中差异CPU之间的通信机制。 看来这个关键字在C#/ Java中比在C / C ++中更严格,但它们之间的差异/影响是什么? 这是C / C ++中volatile的引用。 为什么volatile在multithreadingC或C ++编程中不被认为有用?

Java:引用转义

请阅读以下代码是“不安全构造”的示例,因为它允许此引用转义。 我无法理解’这个’是如何逃脱的。 我是java世界的新手。 任何人都可以帮助我理解这一点。 public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent(Event e) { doSomething(e); } }); } }

如何使用信号量解决生产者 – 消费者?

我需要编写类似于生产者 – 消费者的问题,必须使用信号量。 我尝试了几种解决方案,但没有一种能够解决问题。 首先,我在维基百科上尝试了一个解决方案但它没有用。 我目前的代码是这样的: 消费者的方法运行: public void run() { int i=0; DateFormat dateFormat = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss”); String s = new String(); while (1!=2){ Date datainicio = new Date(); String inicio=dateFormat.format(datainicio); try { Thread.sleep(1000);///10000 } catch (InterruptedException e) { System.out.println(“Excecao InterruptedException lancada.”); } //this.encheBuffer.down(); this.mutex.down(); // RC i=0; while (i<buffer.length) { if (buffer[i] […]

Java阻塞问题:为什么JVM会在许多不同的类/方法中阻塞线程?

更新:这看起来像一个内存问题。 一个3.8 Gb的Hprof文件表明当发生“阻塞”时,JVM正在转储它的堆。 我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了该实例。 我相信他们在堆转储完成之前关闭了网站。 日志没有错误/exception/问题证据 – 可能是因为JVM在生成错误消息之前被杀死了。 原始问题我们有一个最近的情况,应用程序出现 – 最终用户 – 挂起。 我们在应用程序重启之前得到了一个堆栈跟踪,我发现了一些令人惊讶的结果:527个线程,463个线程状态为BLOCKED。 在过去过去被阻塞的线程通常有这个问题:1)一些明显的瓶颈:例如一些数据库记录锁定或文件系统锁定问题导致其他线程等待。 2)所有被阻塞的线程将阻塞相同的类/方法(例如jdbc或文件系统clases) 不寻常的数据在这种情况下,除了应用程序类(包括jdbc和lucene调用)之外,我还看到了各种类/方法被阻止,包括jvm内部类,jboss类,log4j等 问题是什么会导致JVM阻止log4j.Hierarchy.getLogger,java.lang.reflect.Constructor.newInstance? 显然有些资源“稀缺”,但哪些资源? 谢谢 将 堆栈跟踪摘录 http-0.0.0.0-80-417″ daemon prio=6 tid=0x000000000f6f1800 nid=0x1a00 waiting for monitor entry [0x000000002dd5d000] java.lang.Thread.State: BLOCKED (on object monitor) at sun.reflect.GeneratedConstructorAccessor68.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at org.jboss.ejb.Container.createBeanClassInstance(Container.java:630) http-0.0.0.0-80-451″ daemon prio=6 tid=0x000000000f184800 nid=0x14d4 […]