View Full Version : سوال: دو process در یک برنامه
dasssnj
سه شنبه 15 مهر 1393, 16:44 عصر
سلام.
من توی برنامم دو تا فایل jar دارم . که هر دو شون متد main دارن. فایل دوم به صورت لایبرری به اولی اضافه شده .
من می خوام وقتی از توی فایل jar اول متد main اون را صدا می زنم اون به عنوان یه برنامه ی دیگه اجرا بشه و برای خودش process جدا داشته باشه . در صورتی که وقتی متد System.exit توی دومی فراخوانی شد کل برنامه بسته نشه.
برای این کار از چه روشی باید استفاده کنم ؟
ممنون.
ahmad.mo74
سه شنبه 15 مهر 1393, 17:09 عصر
سلام، بله میشه :)
/**
* @author avb
*/
public class FirstMain {
public static void main(String[] args) {
System.out.println("this is first main!");
Thread hook = new Thread(() -> SecondMain.main(args));
hook.setDaemon(true);
Runtime.getRuntime().addShutdownHook(hook);
System.out.println("exiting from first main...");
System.exit(0);
}
}
/**
* @author avb
*/
public class SecondMain {
public static void main(String[] args) {
System.out.println("this is second main!");
for (int i = 1; i <= 10; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("exiting from second main...");
}
}
* : البته دقیقا اونی که میخواستی نشد ولی میشه اینطوری خودمونو گول بزنیم که دوتا main جداگانه ران کردیم :)
dasssnj
سه شنبه 15 مهر 1393, 17:45 عصر
ممنون.
این کد دقیقا چی کار می کنه ؟
اگه تو کلاس دوم exit فراخوانی بشه فقط خودش بسته میشه یا کل برنامه بسته میشه؟
چرا کد هایی که توی اولی می نویسم قبل از دومی اجرا میشن ؟ من می خوام همون موقع که دومی را صدا می زنم کد هاش اجرا بشن.
ahmad.mo74
سه شنبه 15 مهر 1393, 18:22 عصر
این چیزی که نوشتم رو فراموش کن، کاری که تو میخوای رو انجام نمیده، بالا هم نوشتم ما الان دو تا main جدا ران نکردیم...
دارم فکر میکنم ببینم با reflection یا کامند لاینی میشه class. رو اجرا کرد یا نه...
برای jar. که تکلیف روشنه مثلا:
Runtime.getRuntime().exec("java -jar App.jar");
پیدا کردم جوابشو خبر میدم...
ahmad.mo74
سه شنبه 15 مهر 1393, 18:35 عصر
فکر کنم تنها راهت این باشه :
public class Main {
public static void main(String[] args) throws URISyntaxException, IOException {
URL resource = Main.class.getResource("/App.jar");
File jar = new File(resource.toURI());
Runtime.getRuntime().exec("java -jar " + jar.getAbsolutePath());
System.exit(0);
}
}
فایل App.jar باید تو پوشه src باشه.
dasssnj
سه شنبه 15 مهر 1393, 18:43 عصر
فکر کنم راه درست همین باشه .
پس اکلیپس چجوری فایل های jar ما را اجرا می کنه؟ از همین روش؟
ahmad.mo74
سه شنبه 15 مهر 1393, 19:09 عصر
منظورت ران کردن main توسط کامپایلره؟
کامپایلرها متد main رو از کلاسی که main توشه با reflection اجرا میکنن ولی اینکه چجوری روی jvm جدا ران میشه رو نمیدونم والا !
فکر کنم یه دور دیگه باید مباحث پایه جاوا رو بخونم :))) اصلا ترز کار کردن با jvm و پارامتر فرستادن و ... بلد نیستم :لبخند:
ahmad.mo74
سه شنبه 15 مهر 1393, 19:39 عصر
پیدا کردم
http://www.mkyong.com/java/how-to-load-classes-which-are-not-in-your-classpath/
String path = "c:\\other_classes\\";
try {
File file = new File(path);
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader loader = new URLClassLoader(urls);
Class<?> clazz = loader.loadClass("com.mkyong.io.Address");
Method method = clazz.getMethod("main", String[].class);
Object[] args2 = new Object[1];
args2[0] = new String[]{"1", "2"};
method.invoke(null, args2);
} catch (Exception ex) {
ex.printStackTrace();
}
dasssnj
پنج شنبه 17 مهر 1393, 10:44 صبح
پیدا کردم
http://www.mkyong.com/java/how-to-load-classes-which-are-not-in-your-classpath/
String path = "c:\\other_classes\\";
try {
File file = new File(path);
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader loader = new URLClassLoader(urls);
Class<?> clazz = loader.loadClass("com.mkyong.io.Address");
Method method = clazz.getMethod("main", String[].class);
Object[] args2 = new Object[1];
args2[0] = new String[]{"1", "2"};
method.invoke(null, args2);
} catch (Exception ex) {
ex.printStackTrace();
}
خب این روش با صدا زدن متد main به صورت عادی چه فرقی داره؟
فکر نمی کنم تفاوتی داشته باشه.
من تو برنامه ی خودم برنامه ی ipscanner خودتو ران کردم ولی وقتی برنامه ی خوم می بستم از تو هم بسته میشد. فکر کنم بهترین راه اینه که از command line اجراش کنم.
ahmad.mo74
پنج شنبه 17 مهر 1393, 11:11 صبح
حالا با این روش امتحان کن و نتیجشو ببین.
یکبار هم با روش قبلی (jar) باز کن ببین بازم بسته میشه یا نه، من امتحان کردم مشکلی نداشت!
dasssnj
پنج شنبه 17 مهر 1393, 11:22 صبح
با استفاده از java -jar مشکلی نداشتم و برنامه بعد از بستن برنامه ی خودم بسته نمی شد.
ولی با این کد آخری که دادی وقتی برنامم را می بستم فایلی که باز کرده بودم هم بسته می شد.
ahmad.mo74
پنج شنبه 17 مهر 1393, 11:30 صبح
آهان، پس دیگه مشکلی نیست...
موقعی که از کلاس ها استفاده میکنیم و main یک برنامه دیگه رو اجرا میکنیم دوباره روی همون jvm اجرا میشه و وقتی main اصلی که نقطه شروع برنامه بوده بسته میشه jvm تمام پروسس های مربوط به اون رو هم متوقف میکنه، فکر میکنم این روشیه که کامپایلر ها ازش استفاده میکنن.
اما وقتی jar فایل رو صدا میکنیم و اجرا میکنیم، دیگه روی همون jvm اجرا نمیشه و کاملا جدا و روی jvm خودش اجرا میشه، پس وقتی یکی از برنامه ها بسته میشه اونیکی همچنان به کار خودش ادامه میده!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.