Создание потока из ListenerAdapter останавливает его для прослушивания событий Java JDA - PullRequest
0 голосов
/ 23 января 2020

Привет, у меня есть этот JDA Discord Bot, над которым я работаю, и я немного борюсь с потоками. Мой основной класс ботов расширяет ListenerAdapter, и я хочу, чтобы он прослушивал команду, которая затем запускает запланированную службу для отправки сообщения раз в неделю. Проблема в том, что когда поток создается, он начинает это делать, но основной класс перестает слушать.

Интересно, должен ли я создать внутренний класс, который является ListenerAdapter, и, возможно, иметь их оба в потоках, или есть ли другое решение, которое мне не хватает. Я сделал некоторую работу с потоками в университете, но не так много опыта.

public class Main extends ListenerAdapter {
static Thread SER;

public static void main(String[] args) throws LoginException {
... 
}
@Override
public void onMessageReceived(MessageReceivedEvent event){
if(event.getMessage().getContentRaw().equals("!startmessages")){
        try {
            SER = new Thread(new ScheduledExecutorRepeat(event.getChannel(),event.getGuild()));
            ExecutorService executor = Executors.newCachedThreadPool();
            executor.submit(SER);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Creating messages");
    }
}
class ScheduledExecutorRepeat implements Runnable {

private int count = 0;
MessageChannel channel;
Guild guild;
ScheduledExecutorService ses;
ScheduledFuture<?> scheduledFuture;

public ScheduledExecutorRepeat(MessageChannel mc,Guild g) throws InterruptedException {

    channel = mc;
    guild = g;

    ses = Executors.newScheduledThreadPool(1);
    run();



}
public void run(){

    Runnable task1 = () -> {
        count++;
        System.out.println("Running...Weekly Message - count : " + count);

    };

    // init Delay = 5, repeat the task every 1 second
    scheduledFuture = ses.scheduleAtFixedRate(task1, 5, 1000*60*60*24*7, TimeUnit.SECONDS);

    while (true) {
        System.out.println("count :" + count);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1 Ответ

0 голосов
/ 23 января 2020

Программа застряла в l oop в конце класса ScheduledExecutorRepeat. Удаление пока l oop исправило проблему. Запланированные сообщения работают, и бот все еще слушает сообщения.

...