Tag: multithreading

条件是否为每个对象提供多个等待集?

我正在阅读java.util.concurrent.locks.Condition Condition。 条件因素将对象监视器方法(wait,notify和notifyAll)>分解为不同的对象,以通过将它们与使用任意Lock实现相结合来实现每个对象具有多个等待集的效果。 有人可以解释一下吗? 这比普通的同步块或方法有什么好处?

春豆线安全

我正在为一个Java类声明一个Spring bean,它用作创建对象的工厂。 我想从不同的线程使用这个工厂,我遇到的问题是线程在尝试使用工厂创建对象时被阻止。 据我所知,春豆是默认的单身人士,这就是我想要的。 我希望工厂是一个单身人士,但我想从不同的线程使用这个工厂创建对象。 工厂中的方法createObject()未同步,因此我不太清楚为什么我遇到此同步问题。 有关哪种方法是实现这一目标的最佳方法? 这是工厂的java代码: public class SomeFactory implements BeanFactoryAware { private BeanFactory beanFactory; public List createObjects() { List objects = new ArrayList(); objects.add((SomeObject)beanFactory.getBean(SomeObject.class.getName())); return objects; } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } }

主方法中的同步块

在下面关于线程之间同步的代码中,根据生成的输出,为什么控制被转移到执行新线程,尽管在主方法中为同一对象“dt”获取了锁? public class DemoThread extends Thread { public DemoThread() { } public void run() { int i=0; synchronized(this) { while(++i=2) this.notify(); }catch(InterruptedException ie) { ie.printStackTrace(); System.exit(1); } } } } private static int sum; public static void main(String… args) { DemoThread dt = new DemoThread(); dt.start(); synchronized(dt) { try{ System.out.println(“main here”); dt.wait(); System.out.println(“main here again”); […]

怎么可能,3个线程处于阻塞状态,等待同一个监视器,并且没有线程拥有该监视器

在我们的生产环境中,weblogic服务器挂起半小时,看起来它有死锁线程。 但是在调查线程转储之后,同一个锁阻塞了3个线程,但没有其他线程拥有这个锁..这是堆栈跟踪 .. 你对这种侮辱有什么合理的解释吗? 这是被阻止的线程; “pool-1013-thread-5”prio = 7 tid = 600000000842be00 nid = 17280 lwp_id = 518677正在等待监视器条目[9fffffffe6aff000..9fffffffe6b00bd0] java.lang.Thread.State:在org.apache上的BLOCKED(在对象监视器上)。 log4j.Category.callAppenders(Category.java:201) – 等待在org.apache.log4j.Category.forcedLog(Category.java:388)的org上锁定(一个org.apache.log4j.spi.RootLogger)位于org.hibernate.jdbc.AbstractBatcher.logOpenResults(AbstractBatcher.java:426)的org.slf4j.impl.Log4jLoggerAdapter.debug(Log4jLoggerAdapter.java:173)中的.apache.log4j.Category.log(Category.java:853) Org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:210)org.hibernate.loader.Loader.getResultSet(Loader.java:1808) “pool-1013-thread-4”prio = 7 tid = 6000000008413400 nid = 17279 lwp_id = 518676等待监视器条目[9fffffffe6eff000..9fffffffe6f00b50] java.lang.Thread.State:在org.apache上的BLOCKED(在对象监视器上)。 log4j.Category.callAppenders(Category.java:201) – 等待在org.apache.log4j.Category.forcedLog(Category.java:388)的org上锁定(一个org.apache.log4j.spi.RootLogger)位于org.hibernate.loader.Loader.getRow(Loader.java:1197)的org.slf4j.impl.Log4jLoggerAdapter.debug(Log4jLoggerAdapter.java:173)的.apache.log4j.Category.log(Category.java:853) Org.hibernate.loader.Loader.ndQuery对象(Loader.java:603)位于org.hibernate.loader.Loader.doQuery.doQuery.doQuery.doQuery.doQuery.doQueryAndInitializeNonLazyCollections(Loader.java:259)org.hibernate.loader.Loader.doQuery(Loader.java:724)中的org.hibernate.loader.Loader.getRowFromResultSet org.hibernate.loader.Loader.loadEntity(Loader.java:1881)org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71)org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader) .jav a:65)atg.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072)org.hibernate.event.def上的org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165)中的.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415)位于org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223)at at org.hibernate.event.If.Conmpl上的org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126)(SessionImpl.java:905) “pool-1013-thread-3”prio = 7 tid = 6000000008411c00 nid = 17278 lwp_id […]

Java中的SQLite连接池 – 锁定数据库

我已经在multithreading环境中阅读了几个关于SQLite的相关主题,但我找不到一个明确的声明,所以请原谅我,我再次提出这个主题。 我需要从多个线程访问应用程序的数据库以执行更新语句。 数据库本身可以是SQLite或MySQL,具体取决于用户的选择。 对于MySQL处理程序,我使用tomcat-jdbc库实现了一个连接池。 现在我正在寻找SQLite处理程序的最佳方法,因为正常的连接池不应该工作,因为SQLite一次只支持一个写入连接来锁定整个数据库。 我应该继续使用相同的连接一个接一个地进行所有线程(通过同步连接?),还是应该使用已经存在的仅存在连接的tomcat库创建连接池? 一个连接的连接池可能超大吗?

如何在Java线程中将记录插入数据库?

我正在尝试处理Java中的多头。 我已经阅读了很多文章和问题(这里是StackOverflow),但没有找到任何明确的例子如何使用它。 我在HsqlDB数据库中有Unique_Numbers表。 共有2列:NUMBER和QTY。 我的任务是检查数字是否存在,如果是,则增加数量的数量,如果没有,则插入此数字。 那么,我得到了什么。 这是我的数据库配置 private final ComboPooledDataSource dataSource; public Database(String url, String userName, String password) throws PropertyVetoException { dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(“org.hsqldb.jdbcDriver”); dataSource.setJdbcUrl(url); dataSource.setUser(userName); dataSource.setPassword(password); dataSource.setMaxPoolSize(10); dataSource.setMaxStatements(180); dataSource.setMinPoolSize(5); dataSource.setAcquireIncrement(5); } 这是我的逻辑: public void insertRow(String number) throws SQLException { int cnt = getCount(number); if (cnt == 0) { insert(number); } else if […]

multithreadingJava,但只有一个线程工作

我的Java线程无法独立工作,如何解决? 这是最初的主要内容: Mechanics mechanics = new Mechanics(busShop, “Mechanic 1”); Mechanics mechanics2 = new Mechanics(busShop, “Mechanic 2”); Thread thMechanic = new Thread(mechanics); Thread thMehanic2 = new Thread(mechanics2); thMechanic.start(); thMehanic2.start(); 到目前为止没问题,按预期工作,所以机械师这样做: public void run() { fixEngine(); } private void fixEngine() { while (true) { busShop.FixEngine(MechanicsName); } } 正如此处所见,它可以永久修复引擎,在修复引擎function中: public static List ListBusEngineFix = new LinkedList(); public void […]

等待Java的条件

我想创建一个线程,当它变为空时将值放入队列并等待这个条件,而不是。 这是我尝试使用的代码,但它打印出来 Adding new Taking Value 1 Taking Value 2 Taking Value 3 Taking Value 4 所以它只工作一次。 问题是什么? import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class SO { public String test; public String[] list = new String[] {test}; public static void main(String[] args) { new SO(); } public SO() { go(); } BlockingQueue qq = new LinkedBlockingQueue(); […]

如何使用Reactor framework 2.x执行multithreading映射/减少?

我之前曾向Reactor 1.x提出这个问题 : 假设我有一个Collection 。 我要: 将每个Map实例同时转换为Foo类型的对象(每个实例完全独立于另一个实例 – 不需要串行/迭代地转换每个实例)。 当所有这些都被转换时,我想要一个方法onReduce(Collection foos)被调用 – 该参数包含所有生成的Foo实例。 但我们似乎无法找到Reactor 2.x的等效解决方案 – 只需单线程。 你如何在Reactor 2.x中执行multithreadingmap / reduce? 例如,如何使用基于ExecutorService的Dispatcher执行此操作?

Java:如何从运行的线程中获取完成的线程来拾取任务

我正在使用具有不同运行时间的任务的multithreading应用程序。 当一个线程完成时,是否有办法从仍在运行的线程中接管某些任务? 这是一个例子。 我用5个线程启动程序,每个程序有50个任务。 当最快的运行线程完成时,另一个线程仍然有40个任务要完成。 如何让完成的线程从另一个线程中获取20个任务,因此每个线程继续工作20个,而不是等待正在运行的线程完成剩下的40个?