![](/img/trans.png)
[英]Deterministic record/replay framework for testing multi-threaded java applications
[英]Developing multi threaded applications in Java
如果可以这样开发的话,这将是我的第一个多线程应用程序。 因此,我需要一些入门帮助。
我目前有以下运行良好的JAVA程序
现在,我的要求已更改,我需要使用3个不同的目标数据库(TargetDB1,TargetDB2,TargetDB3)。 每个人都有不同的连接信息。
我的问题是,我们可以使它成为多线程应用程序吗?
线程1将获取源对象
线程2将获取TargetDB1对象,与源对象(从线程1获得)进行比较,并在与源对象不同的情况下更新TargetDB1
线程3将获得TargetDB2对象,与源对象(从线程1获得)进行比较,并在与源对象不同的情况下更新TargetDB2
线程4将获取TargetDB2对象,与源对象进行比较(从线程1获得),并在与源对象不同的情况下更新TargetDB2
如果可以将其开发为多线程应用程序,那么该如何做。
我将使用某些BlockingQueue
例如LinkedBlockingQueue
为每个目标数据库创建一个工作队列。 生产者线程将从源数据库获取对象,然后将其添加到每个工作队列中。 然后,连接到目标数据库的每个线程都可以从其工作队列中退出,并以自己的速度更新其数据库。
源数据库线程可能类似于:
// allow only 10 outstanding objects to be in the work queue before it blocks
queue1 = new LinkedBlockingQueue<SourceObject>(10);
new Thread(new TargetDatabaseThread("url-to-database1", queue1)).start();
queue2 = new LinkedBlockingQueue<SourceObject>(10);
new Thread(new TargetDatabaseThread("url-to-database2", queue2)).start();
queue3 = new LinkedBlockingQueue<SourceObject>(10);
new Thread(new TargetDatabaseThread("url-to-database3", queue3)).start();
while (true) {
SourceObject sourceObj = getFromSourceDatabase();
// this might block if you set a capacity on your queue and it was full
queue1.put(sourceObj);
queue2.put(sourceObj);
queue3.put(sourceObj);
}
然后,每个目标数据库线程可能看起来像:
public class TargetDatabaseThread implements Runnable {
private final String jdbcUrl;
private final BlockingQueue queue;
private volatile boolean shutdown;
public TargetDatabaseThread(String jdbcUrl, BlockingQueue queue) {
this.jdbcUrl = jdbcUrl;
this.queue = queue;
}
public void run() {
// maybe some initialization, make database connection, etc.
while (!shutdown) {
// this would block if nothing is in the queue
SourceObject sourceObj = queue.take();
SourceObject targetObj =
getObjectFromTargetDatabase(sourceObj.getId());
if (updateTarget(sourceObj, targetObj)) {
updateMyTargetObjectInDatabase(targetObj);
}
}
}
}
该模型的一个问题是目标数据库线程是否需要以任何方式更新源对象。 如果是这种情况,则必须同步对象。
请注意,可以为队列设置容量。 如果生产者从源数据库中读取数据比目标数据库写入者更容易更新数据库,这将很有用。 您不希望队列填充内存,因为目标数据库很慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.