Предположим, что для простого сценария с двумя потоками используется следующий псевдокод:
У меня есть два потока, я хотел бы вставить данные в разные таблицы в базу данных. В потоке 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)
}
}