Запуск двух классов Java одновременно
Есть два файла с классами под названием «classA.class» и «classB.class» в папке «C:\Folder\». Моя программа имеет лишь строчки String classA = «classA»; String classB = «classB»; . Как запустить оба класса одновременно? То есть запустить команду public static void run() <. >, присутствующую в этих классах.
Отслеживать
задан 27 окт 2015 в 14:58
2,510 5 5 золотых знаков 29 29 серебряных знаков 59 59 бронзовых знаков
Что в данном случае значит запустить? Какая связь между class-ами и exe-файлом?
27 окт 2015 в 15:11
Добавил правку в вопрос. Прочитайте ещё раз.
27 окт 2015 в 15:15
Стало немного яснее, но не совсем. Предположу, что Вам нужен батник, который запустит две копии exe для каждого из класса. Стандартная команда Windows start поможет запустить их одновременно. Точнее вторая копия не будет дожидаться завершения первой
27 окт 2015 в 15:17
Добавил ещё правку. Прочитайте ещё раз).
27 окт 2015 в 15:18
@Lesperanza, я тоже ничего не понял. У вас есть два класса (не String, а что-то такое, что вы сами написали). Внутри них есть метод и вы хотите его выполнить, когда создаёте объект класса. Так?
27 окт 2015 в 15:23
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для начала, надо определиться, находится папка c:\Folder\ в classpath или нет. Если да, то первый шаг пропускается, иначе — надо создать новый загрузчик классов, указав ему эту папку. Про загрузчики классов читайте отдельно, это слишком крупная тема для формата «вопрос-ответ» (поэтому лучше если классы будут в classpath).
Далее, надо определиться со способом запуска. Если вы заранее знаете имена классов — то вам надо лишь создать два потока:
new Thread(() -> classA.run()).start(); new Thread(() -> classB.run()).start();
Еще красивее будет, если метод run — не статический, а классы classA и classB реализуют интерфейс Runnable :
new Thread(new classA()).start(); new Thread(new classB()).start();
Если же имена классов для запуска вам заранее не известны — то надо воспользоваться рефлексией:
static void RunClassByName(String name) < try < Classclazz = Class.forName(name); Object instance = clazz.newInstance(); Runnable runnable = Runnable.class.cast(instance); // Я использую именно такую форму, чтобы сделать возможное исключение проверяемым runnable.run(); > catch (. ) < // Тут надо как-то обработать это исключение >> . new Thread(() -> RunClassByName("classA")).start(); new Thread(() -> RunClassByName("classB")).start();
Возможные исключения, которые надо бы обработать, смотри в документации к используемым методам.
В этом варианте сам поиск нового класса, создание экземпляра и запуск происходят в отдельном потоке. Также предполагается, что классы classA и classB реализуют Runnable , в противном случае вместо вызова newInstance вам потребуется найти статический метод run и вызвать его:
static void RunClassByName(String name) < try < Classclazz = Class.forName(name); Method runMethod = clazz.getMethod("run"); runMethod.Invoke(null); > catch (. ) < // Тут надо как-то обработать это исключение >>
Но все, что было написано выше, касается лишь однократного вызова методов (при старте программы, к примеру). Для постоянных вызовов одного и того же метода рефлексия — слишком медленная. Если все, что вам надо — это указать обработчик события, то лучше использовать лямбды:
Runnable methodA = () -> classA.runA(); Runnable methodB = () -> classB.runB(); Runnable methodC = () -> classB.runC(); . methodA.run();
Вам же все равно надо где-то указывать названия классов? Ну так можно вместо этого указывать сразу имена заранее заготовленных переменных или полей.
Если же вам обязательно нужны строки — тоже не беда:
Map map = new HashMap(); map.put("methodA", () -> classA.runA()); map.put("methodB", () -> classA.runB()); map.put("methodC", new classC()); // специально показываю разные возможные варианты . map.get("methodA").run();
Решение ошибки «Could not find or load main class» в Java
Ошибка «Could not find or load main class» в Java – одна из самых распространенных проблем, с которой сталкиваются начинающие разработчики. Эта ошибка возникает, когда Java Runtime Environment не может найти главный класс, который был указан для выполнения.
В качестве примера рассмотрим следующий код:
public class HelloWorld < public static void main(String[] args) < System.out.println("Hello, World!"); >>
Если вы скомпилируете этот код, используя javac HelloWorld.java , и затем попытаетесь выполнить его с помощью java HelloWorld , но получите ошибку «Could not find or load main class HelloWorld», это означает, что среда выполнения Java не может найти класс HelloWorld .
Причины возникновения ошибки
Основные причины, по которым может возникнуть эта ошибка, включают:
- Некорректное имя класса. Java чувствительна к регистру, поэтому helloworld и HelloWorld — это разные имена.
- Класс находится в пакете, и его имя должно быть полным, включая имя пакета. Например, java com.example.HelloWorld .
- Класс скомпилирован, но находится вне класспути.
- Отсутствует метод main в классе.
Решение проблемы
Чтобы решить эту проблему, следует выполнить следующие шаги:
- Убедитесь, что имя класса указано правильно. Java чувствительна к регистру, поэтому HelloWorld и helloworld — это разные имена.
- Если класс находится в пакете, убедитесь, что вы указали полное имя класса, включая имя пакета. Например, java com.example.HelloWorld .
- Проверьте класспуть. Если класс скомпилирован, но находится вне класспути, вам нужно добавить его в класспуть или изменить класспуть таким образом, чтобы он включал каталог, в котором находится скомпилированный класс.
- Убедитесь, что в вашем классе есть метод main . Этот метод является точкой входа в приложение, и без него Java Runtime Environment не сможет выполнить ваш класс. Метод main должен иметь следующую сигнатуру: public static void main(String[] args) .
Применяя эти рекомендации, вы сможете успешно запустить свой Java-класс и избежать ошибки «Could not find or load main class».
Выполнение программы Java без основного метода
В этом посте будет обсуждаться, как выполнить программу Java без основного метода.
Но перед main() вызывается метод, виртуальная машина Java запускается путем загрузки класса в память, и класс инициализируется путем выполнения его статических инициализаторов и инициализаторов для статических полей, объявленных в классе.
Поскольку статические инициализаторы выполняются до main() метод, можно запустить программу Java без main() метод с использованием статического инициализатора, как показано ниже:
class Main
System . out . println ( «Java Program without main()» ) ;
System . exit ( 0 ) ;
Теперь, как только Util класс загружен, сообщение будет напечатано. Мы сразу позвонили System.exit(0) в следующей строке, чтобы предотвратить исключение “основной класс не найден”.
Обратите внимание, что этот подход не будет работать в Java 7 и выше. Несмотря на то, что код скомпилируется, при выполнении он выдаст следующее исключение:
The program was compiled successfully, but the main class was not found.
Main class should contain method: public static void main(String[] args).
В Java 7 и выше альтернативой является написать собственный лаунчер JVM для определения пользовательских точек входа в приложение.
Кроме того, если код Java предназначен для использования в качестве библиотеки, main() метода не будет.
Вот и все, что касается выполнения Java-программы без основного метода.
Оценить этот пост
Средний рейтинг 4.67 /5. Подсчет голосов: 9
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Как запустить класс в java
В последних версиях IntelliJ IDEA вы можете столкнуться с ошибкой «is not allowed to run in parallel» при попытке запустить несколько экземпляров программы одновременно.
Сообщение об ошибке выглядит примерно так:
Чтобы запустить несколько экземпляров программы одновременно, необходимо войти в настройки и поставить одну галочку “Allow running in parallel” в чекбоксе в диалоге Run/Debug Configuration.
Чтобы вызвать диалог нажмите в верхнем правом углу на названии вашего главного выполняемого класса. В этом случае откроется диалог настройки.
Выглядит он примерно так:
Необходимая вам галочка находится в верхнем правом углу.
