java: как выполнить некоторые Runnables последовательно?

в то время как мы хотим выполнить 2 Runnable s:

executor.execute(new Runnable1());
executor.execute(new Runnable2());

неизвестно, что запуск Runnable начнется первым? но сначала я хочу запустить Runnable1 для выполнения. как это сделать?

1
nl ja de

2 ответы

Почему бы не создать один runnable, который просто запускает Runnable1() , а затем Runnable2() ? Если вы не хотите, чтобы они выполнялись параллельно, не отправляйте их обоим исполнителям отдельно ...

Например:

executor.execute(new Runnable() {
    @Override public void run() {
        new Runnable1().run();
        new Runnable2().run();
    }
});

Конечно, вы должны подумать о том, что вы хотите, если Runnable1 выбрасывает исключенное исключение - вы хотите запустить Runnable2 или нет?

EDIT: с вашими обновленными требованиями звучит как really , что вы хотите, чтобы ваш второй запуск запускался только тогда, когда ваш первый runnable достиг определенной точки (например, сокет был создан и прослушивает подключения). Вы вполне можете захотеть поместить какой-то крючок в этот код, чтобы вы могли запустить второй runnable , когда вы доберетесь :

// Somewhat pseudo-code...
Server server = new Server();
server.onStartedListening(new Runnable() {
    @Override public void run() {
        executor.execute(new ClientConnection());
    }
});
executor.execute(server);
9
добавлено
Как вы предотвращаете Runnable1 «не завершение выполнения»? ОС может упредить ваш поток/процесс всякий раз, когда ему это нравится. У вас нет контроля над Планировщиком ОС. Это не может работать, если вы специально не нацеливаете свое приложение на работу в многопроцессорной многозадачной многозадачной ОС (что, на мой взгляд, фактически не существует).
добавлено автор Mikkel Løkke, источник
Я хочу, чтобы они выполнялись параллельно, но сначала тот, который мне нужен, запускает (не завершает выполнение, только начинает), а другой
добавлено автор Soheil, источник
например, первый Runnable - это ServerSocket , который должен сначала запускаться и ждать входящих соединений, а второй - клиентом (a Socket code>), который хочет подключиться к этому серверу, поэтому важны как параллелизм, так и последовательный
добавлено автор Soheil, источник
@JonSkeet в ситуации, о которой я упоминал выше, сервер Runnable ДОЛЖЕН быть выполнен FIRST, ждет входящих сокетов для принятия, затем другой Runnable , который является Socket , который хочет подключиться начинают исполняться ..
добавлено автор Soheil, источник
@JonSkeet да, теперь мы снова доходим до первого вопроса, как это сделать сначала? с другой стороны, я думал о Lock and Condition, что вы думаете?
добавлено автор Soheil, источник
@JonSkeet Я не понимаю ваш код, что такое .onStartedListening() ? Хорошо, мы должны запустить другой Runnable, пока сервер встал и ожидает приема входящих соединений, но как понять, что сервер прослушивает его порт?
добавлено автор Soheil, источник
@JonSkeet извините (// Несколько псевдокод ...)!
добавлено автор Soheil, источник
@JonSkeet не могли бы вы помочь мне больше узнать, как понять, является ли serverSocket прослушивание указанного порта или нет? мне ничего не приходило в голову!
добавлено автор Soheil, источник
добавлено автор Soheil, источник
@Soheil: Это не имеет смысла. Представьте, что из них можно сразу же прервать сразу после того, как он выполнит первый оператор. В чем разница между этим и «неправильным», начиная с первого? Похоже, вам нужно прояснить в своём уме, какие у вас требования к заказу. Должен ли первый runnable достигнуть определенного этапа до того, как второй будет запущен?
добавлено автор Jon Skeet, источник
Но что более важно, вам нужно получить одну конкретную часть первого Runnable - сокет должен быть создан. Нехорошо just , начиная с первой runnable, если она не дойдет до этой точки до запуска второй runnable.
добавлено автор Jon Skeet, источник
@Soheil: Нет, вопрос не в том, «как это сделать сначала» - это «как достичь определенной точки в одной задаче до начала следующего», что сильно отличается. И нет, я бы не вводил замки и т. Д. - я бы добавил крючок, чтобы вы могли ясно дать понять, что хотите только начать вторую задачу, когда первая достигнет соответствующей точки. См. Мой отредактированный ответ.
добавлено автор Jon Skeet, источник
@Soheil: onStartedListening() будет методом, который вы бы добавили к вашему серверному коду, который позволяет вызывать крючок при создании порта. В принципе вы должны как-то разоблачить этот аспект.
добавлено автор Jon Skeet, источник
@Soheil: Ум, вы делаете код, который создает сокет, уведомляет слушателей, когда он создает сокет и начал слушать ...
добавлено автор Jon Skeet, источник

Inside your Runnable2() code check for status of Runnable1.completed

Где в Runnable1 определить static boolean completed = false; и сделать его истинным после завершения выполнения в Runnable1

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async