- Баллы
- 61
- Имя в Minecraft
- tiu
Добрый день, я тут разрабатывал некий датацентер и случился казус.
У нас есть некий метод get(String data), который отправляет запрос на БД. Ответ же на запрос приходит в другом методе answer(String data). Внимание, ВОПРОС: Как нужно правильно сделать запрос к бд, чтобы при этом задержать метод get(), но при этом не останавливая основной поток, т.к. если остановить осн поток, ответ не дойдёт до получателя. Есть некие наработки. Поток t создан исключительно в целях тестирования.
Просьба скидывать ответ с примерами, а то я тупой
P.s. Если чо, объект Packet потом преращается в нормальное сообщение
P.s.s. Вся проблема в строчке lock.wait(2000);, которая стопает осн поток и мешает ответу добраться до сервера. Запихать приём в отд поток-не вариант(
У нас есть некий метод get(String data), который отправляет запрос на БД. Ответ же на запрос приходит в другом методе answer(String data). Внимание, ВОПРОС: Как нужно правильно сделать запрос к бд, чтобы при этом задержать метод get(), но при этом не останавливая основной поток, т.к. если остановить осн поток, ответ не дойдёт до получателя. Есть некие наработки. Поток t создан исключительно в целях тестирования.
Просьба скидывать ответ с примерами, а то я тупой

PHP:
package DataCenter;
import org.bukkit.Bukkit;
import DataCenter.enums.Packet;
public class test{
private static String answer="";
private static Object lock=new Object();
public static void answer(String data) {
Bukkit.getLogger().info("answer="+data);
synchronized (lock) {
answer=data;
lock.notifyAll();
}
}
private static Packet last;
private static Runnable r=new Runnable() {
@Override
public void run() {
Messenger.SendRequest(last, Messenger.server);
Bukkit.getLogger().info("SubThread started");
synchronized (lock) {
try {
lock.wait();
Bukkit.getLogger().info("NOTIFY");
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
return;
}
}
};
public static String get(Packet packet) {
Thread t=new Thread(r);
last=packet;
Messenger.SendRequest(last, Messenger.server);
t.start();
synchronized (lock) {
try {
lock.wait(2000);
return answer;
} catch (InterruptedException e) {
e.printStackTrace();
}
return answer;
}
}
}
P.s. Если чо, объект Packet потом преращается в нормальное сообщение
P.s.s. Вся проблема в строчке lock.wait(2000);, которая стопает осн поток и мешает ответу добраться до сервера. Запихать приём в отд поток-не вариант(
