我正在尝试在几个线程(6)之间同步一个int计数器。下面是我的工人班。我正在尝试同步我的私有字段计数器测试
:
public class DbWorker implements Callable {
private final Object lock = new Object();
private int countertest = 0 ;
private boolean IsActive(Integer act)
{
synchronized(lock){
boolean exists = false;
countertest++;
....
System.out.println("countertest IS : " + countertest );
}
return true;
}
public void run() {
....
IsActive(act):
...
}
}
在我的主类中,我使用 for 循环和执行器服务创建线程。请参阅以下内容:
private ExecutorCompletionService<Integer> _objQueue ;
for(int j = 0; j < 6; j++){
_objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j ) );
}
我的反测试变量不同步,它打印不同的数字(非顺序)。我做错了什么?
因为您在循环中创建了一个实例,其中antitest
和lock
是实例变量,因此每个对象都将获得一个新对象。
>
反测试
在这种情况下始终为1,实例之间不共享
多个线程没有获得同一个锁,所以这是没有用的。
你的锁
private final Object lock = new Object();
是实例字段。换句话说,每个< code>DbWorker对象都有一个。
然后将DbWorker
实例提交给执行
_objQueue.submit( new DbWorker( "SOME PARAMETER" , _snapshots.get(j) , j ) );
每个线程都有自己的< code>DbWorker,因此也有自己的锁。线程从不与任何其他线程竞争。
创建一个数据库工作线程
并在线程之间共享它,即。每次都提交
相同的数据库工作
实例。
问题内容: 假设我有一个利用该框架的应用程序 当我在调试器中运行此应用程序时,将使用以下(默认)名称创建一个线程:。如你所见,这并不是非常有用,而且据我所知,该框架没有提供一种简便的方法来命名已创建的线程或线程池。 那么,如何为线程/线程池提供名称呢?例如,。 问题答案: 你可以提供一个到。工厂将负责创建线程,并将能够为其命名。 引用Javadoc: 创建新线程 使用创建新线程。如果没有另外指定,
这是我在这里的第一篇文章,提前感谢您的宽容。 我有一个带有作业队列的线程池 工艺流程: 初始化线程池(M 个线程数) 将 N 个任务放入队列中(N 个可以是 问题是同步点。我使用计数器和互斥锁实现了一个简单的信号量:在步骤2之前,计数器用要加载的任务数初始化,当每个任务完成时,计数器递减。如果counter==0,则我从工作线程发送pthread_cond_signal,步骤4中的pthrea德_
本文向大家介绍java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例,包括了java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例的使用技巧和注意事项,需要的朋友参考一下 1、CountDownLatch: 一个同步工具类,它允许一个或多个线程一直等待,直到其他线
在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 “默契” 协作才能使这项工作无差错执行?下面举个例子说明。 例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递: 如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它,这将引起数
每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime
本文向大家介绍在spring boot中使用java线程池ExecutorService的讲解,包括了在spring boot中使用java线程池ExecutorService的讲解的使用技巧和注意事项,需要的朋友参考一下 1. 认识java线程池 1.1 在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处: 1.减少在创建和销毁线程上所花的