У меня есть многопоточное java-приложение, которое извлекает имена пользователей из базы данных Postgresql для обработки.Java синхронизированный блок не работает
Я хочу, чтобы одна учетная запись обрабатывалась одновременно по каждому потоку, поэтому у меня есть столбец в моей таблице, у которого есть отметка времени последнего доступа, и будут получены только учетные записи, которые были доступны более 30 секунд. SQL Query работает ниже, я только публикую его, чтобы быть ясным.
select * from account where (EXTRACT(EPOCH FROM (now() - last_accessed)) > 30 OR last_accessed is null) AND enabled = true order by random() limit 1
У меня есть синхронизированный блок так только один поток может получить доступ к процессу извлечения счетов как обновления штампа времени принимает предложение времени в базе данных.
public class TC extends Common implements Runnable
{
RegularExpr reg = new RegularExpr();
Database db = new Database();
public void run()
{
while (true)
{
try
{
ArrayList<Object> accountInfo = null;
synchronized (this)
{
accountInfo = db.getAccount();
db.updateAccountAccessTime((String) accountInfo.get(0));
Thread.sleep(3000);
}
System.out.println((String) accountInfo.get(0));
Thread.sleep(9999999);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
Мой главный класс
public class Main
{
public static void main(String[] args)
{
for (int i = 0; i < 3; i++)
{
System.out.println("Inside loop to create threads!");
Thread newThread = new Thread(new TC());
newThread.start();
}
}
}
Но я все еще получаю ту же учетную запись при запуске программы. Что я делаю неправильно?
Как я могу достичь того, что мне нужно? – Arya
Вам понадобится использовать статический конечный объект на TC-классе и использовать его для синхронизации вместо этого. – Codebender