gpt4 book ai didi

java - 在哪里关闭多线程的连接/文件/日志?

转载 作者:搜寻专家 更新时间:2023-10-31 19:46:12 24 4
gpt4 key购买 nike

假设以下伪代码用于一个简单的双线程场景:

我有两个线程,我想将数据插入到数据库的不同表中。在线程 1 上,我想插入一些表,同时,我想将其他数据插入线程 2。我的问题是如何/在哪里放置 connection.close(),如果我放置它在线程 1 上执行,而线程 2 仍在处理,反之亦然,如果线程 2 已完成并关闭连接,但线程 1 尚未完成。

注意,数据库只是一个例子,它可以是文件、记录器等任何东西。

class Thread1{
DataBaseConnection connection;
main(){
threadPool = Executors.newFixedThreadPool(1);
connection.open();
if(ThisMightTakeSomeTime)
threadPool.submit(new MyRunnable(connection));
InsertDataToDataBase(Table A, Table B));
connection.Close(); //What if thread2 isn't done yet?
}
}

public class MyRunnable implements Runnable {
MyRunnable(connection){}
@override
void Run() { ...}
void TaskThatMayTakeWhile(){
...get data ...
...Connection.InsertToTables(table X, table Y)
}
}

最佳答案

My question is how/where to place connection.close(),

首先,据我所知,您应该与 2 个不同的线程共享一个连接。每个线程都应该有自己的数据库连接,可能使用数据库连接池,例如 Apache's DBCP .

一旦你有多个连接,我会让每个线程管理它自己的连接并将其释放回池中。您应该确保这是在 finally block 中完成的,以确保如果出现数据库异常,连接仍会被释放。

如果您被迫让多个线程共享同一个连接,那么它们将不得不使用synchronized 来确保它们拥有独占锁:

 synchronized (connection) {
// use the connection
}

如果它是共享的,关于何时关闭它,你可以有一个共享的使用计数器(可能是一个 AtomicInteger)并在计数器变为 0 时关闭它。或者正如其他人所建议的那样,你可以使用线程池,然后线程池完成释放连接。

Note, the database is just an example, it can be anything like a file,logger..etc.

就更通用的答案而言,我总是尝试反射(reflect)事物的创建位置。如果一个方法打开流,那么它应该有关闭流的 finally

 public void someMethod() {
InputStream stream = ...
try {
// process the stream here probably by calling other methods
} finally {
// stream should be closed in the same method for parity
stream.close();
}
}

此模式的异常(exception)是线程处理程序。然后 Thread 应该在 run()call() 末尾的 finally block 中关闭流或释放连接 方法。

 public void serverLoopMethod() {
while (weAcceptConnections) {
Connection connection = accept(...);
threadPool.submit(new ConnectionHandler(connection);
}
}
...
private static class ConnectionHandler implements Runnable {
private Connection connection;
public ConnectionHandler(Connection connection) {
this.connection = connection;
}
// run (or call) method executed in another thread
public void run() {
try {
// work with the connection probably by calling other methods
} finally {
// connection is closed at the end of the thread run method
connection.close();
}
}
}

关于java - 在哪里关闭多线程的连接/文件/日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22151347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com