Tag: multithreading

我怎样才能在rabbitmq中汇集频道?

我一直在尝试在线程之间共享连接,并且只在创建线程时才打开通道,但在研究了一点之后,我想我也想尝试connection pooling 。 我怎么能在rabbitmq上做到这一点? 或者这是一般性的想法我可以普遍适用吗? 我的目标是生成X线程,然后让它们不必打开新的通道(这需要在客户端和服务器之间建立循环)。 由于线程是它们自己的类,我不确定是否需要将池放入生成线程的类本身或它们去哪里?我还有多种类型的线程我想要在它们之间共享这些连接(不是只是一个)。 那可能吗? 为了给你一个大致的想法,这里是如何在rabbitmq中建立连接/渠道: ConnectionFactory factory = new ConnectionFactory(); factory.setHost(“localhost”); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); //I want to share several of these between threads

锁定分裂与锁定条带化

以下是约书亚的Effective Java摘录: 如果在内部同步类,则可以使用各种技术来实现高并发性,例如锁定拆分,锁定条带化和非阻塞并发控制。 上面表明锁定分裂和锁定条带是两种不同的技术,但当我试图找到我之间的区别时,我找不到差异。 它们之间是否有区别或它们是一样的?

在Tomcat下启动线程

有人告诉我你不应该从在Tomcat下运行的webapp(或任何其他容器,大概是)开始你自己的线程 Runnable myRunnable = new Runnable() { public void run() { System.out.println(“I’m running”); } } new Thread(myRunnable).start(); 或类似地: ScheduledThreadPoolExecutor retrySchedulerService = new ScheduledThreadPoolExecutor(3); retrySchedulerService.schedule(dlrRetryTask, 120, TimeUnit.SECONDS); 而不是上述任何一种,你应该从Tomcat知道的某些线程池中请求一个线程。 对此有任何道理,还是完全是poppycock?

3个线程按顺序打印数字

我正在尝试编写一个简单的代码来按顺序打印数字。 场景就像 Thread Number T1 1 T2 2 T3 3 T1 4 T2 5 T3 6 T1 7 T2 8 T3 9 …and so on. 这里是 public class ThreadNumberPrinter { Object monitor = new Object(); AtomicInteger number = new AtomicInteger(1); public static void main(String[] args) { ThreadNumberPrinter tnp = new ThreadNumberPrinter(); Thread t1 = new […]

如何在java中的并行程序中获得理想的线程数?

我需要在批处理程序中获得理想数量的线程,该程序在支持并行模式的批处理框架中运行,如Spring Batch中的并行步骤。 据我所知,执行程序步骤的线程太多并不好,可能会对程序的性能产生负面影响。 一些因素可能导致性能下降(上下文切换,使用共享资源时的竞争条件(锁定,同步……)……(还有其他因素吗?))。 当然,获得理想线程数的最佳方法是让我有实际的程序测试来调整程序的线程数。 但在我的情况下,实际测试并不容易,因为测试需要很多东西(人员,测试计划,测试数据等),这对我来说现在很难准备。 所以,在进行实际测试之前,我想知道如何尽可能地获得我的程序中可猜测的理想线程数。 我应该考虑什么来获得我的程序的理想线程数(步数)? CPU核心数? 我的程序运行的机器上的进程数? 数据库连接数? 在这样的情况下,是否存在诸如公式之类的理性方式?

ArrayList – 添加“相同”对象(same => equals,hashCode),Threads

我有一个问题。 当我尝试将“相同”对象两次添加到ArrayList时会发生什么。 “相同”是指单个类的对象,使用equals()和hashCode()标识为相同。 它对于大多数成员变量具有不同的值,并且可能是从不同的线程创建的,但对于equals()和hashCode(),它们是“相同的”。 第二个对象是否会替换第一个对象? 另外,如果两个线程试图将这些对象完全同时添加到ArrayList会发生什么? 这有可能吗? 如果是,会发生什么? 谢谢! 🙂 [编辑]感谢所有的答案! 我应该使用synchronizedList,而不是使用“synchronize(list){}”吗? – >我读了docs,即使是使用synchronizedList,也应该使用迭代同步(list) [EDIT2] synchronizedList可以声明为成员变量吗? 我试过了,但它没有用。

具有Lambda表达式的线程

我在第42和43行有一个错误: Thread t1=new Thread(()->prod.test()); , Thread t2=new Thread(()->cons.test()); 未处理的exception类型InterruptedException 。 如果我尝试quickfix它将创建带有捕获exception的try catch,它将具有相同的错误并将尝试以相同的方式修复它继续用try catch包围它。 import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; interface Predicate { public void test() throws InterruptedException; } class MyClass { int num = 0; Lock lock = new ReentrantLock(); public void produce() throws InterruptedException { lock.lock(); for (int i = 0; i < 1000; i++) { […]

JComponent.paintImmediately()如何在Java Swing中工作?

我的理解:与Swing中的大多数组件/操作不同,对JComponent.repaint()的调用是线程安全的,即虽然重新绘制请求来自另一个线程(即不是来自EDT),但实际绘制仅在EDT中进行。 下面的代码片段演示了这一点。 public class PaintingDemo { public static void main(String[] args) { final JFrame frame = new JFrame(); final JPanel p = new MyPanel(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { frame.add(p, BorderLayout.CENTER); frame.setSize(200, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); new Thread(“MyThread”) { public void run() { while (true) { // Below statements are important […]

ExecutorService应该是静态的还是全局的

我想在整个应用程序中使用相同的线程池。 为此,我可以使ExecutorService静态和全局的,这样我就可以在需要时调用ThreadUtil.executorService来获取ExecutorService 。 public class ThreadUtil { public static final ExecutorService executorService = Executors.newCachedThreadPool(); } 可以像这样实例化多个线程池吗? 另外,我的应用程序是TCP服务器。 如果我不知道池应该有多大,可以简单地使用newCachedThreadPool吗?

迭代WeakHashMap

我正在同时使用WeakHashMap。 我想基于Integer参数实现细粒度锁定; 如果线程A需要修改由Integer a标识的资源,并且线程B对由Integer b标识的资源执行相同的操作,则它们不需要同步。 但是,如果有两个线程使用相同的资源,假设线程C也使用由整数a标识的资源,那么当然线程A和C需要在同一个锁上同步。 当没有更multithreading需要具有ID X的资源时,可以删除Map中用于key = X的Lock。 但是,另一个线程可以在此时进入并尝试在Map中使用ID = X的锁,因此在添加/删除锁时我们需要全局同步。 (这将是每个线程必须同步的唯一地方,无论Integer参数如何)但是,线程无法知道何时删除锁,因为它不知道它是使用锁的最后一个线程。 这就是我使用WeakHashMap的原因:当不再使用ID时,可以在GC需要时删除键值对。 为了确保我对已存在的条目的键具有强引用,并且确切地说是构成映射关键字的对象引用,我需要迭代映射的keySet: synchronized (mrLocks){ // … do other stuff for (Integer entryKey : mrLocks.keySet()) { if (entryKey.equals(id)) { key = entryKey; break; } } // if key==null, no thread has a strong reference to the Integer // key, so no thread […]