1. إنشاء عملية جافا
توفر Java طريقتين لبدء عملية أو برنامج آخر:
(1) استخدم طريقة exec () وقت التشغيل (2) استخدم طريقة Start () لـ ProcessBuilder (2)
1.1 ProcessBuilder
فئة ProcessBuilder هي فئة جديدة تمت إضافتها حديثًا في Java.Lang بواسطة J2Se 1.5. قبل J2SE 1.5 ، تم تنفيذ التحكم في العملية وإدارتها بواسطة فئة العملية.
يدير كل مثيل ProcessBuilder مجموعة من خصائص العملية. تستخدم طريقة Start () هذه الخصائص لإنشاء مثيل عملية جديد. يمكن استدعاء طريقة START () مرارًا وتكرارًا من نفس الحالة لإنشاء عملية جديدة للطفل بنفس الخصائص أو ذات الصلة.
يدير كل مولد عملية خصائص العملية هذه:
الأمر عبارة عن قائمة بالسلاسل التي تمثل ملف البرنامج الخارجي المراد استدعاؤه ومعلماته (إن وجدت). هنا ، تعتمد قائمة السلاسل التي تمثل أوامر نظام التشغيل الصالحة على النظام. على سبيل المثال ، يصبح كل متغير إجمالي عادةً عنصرًا في هذه القائمة ، ولكن هناك أنظمة تشغيل تريد أن يحدد البرنامج سلاسل سطر الأوامر بأنفسهم - في مثل هذه الأنظمة ، قد تتطلب تطبيقات Java أوامر تضمين هذين العنصر بالضبط.
البيئات هي تعيينات تعتمد على النظام من المتغيرات إلى القيم. القيمة الأولية هي نسخة من بيئة العملية الحالية (انظر System.getenv ()).
دليل العمل. القيمة الافتراضية هي دليل العمل الحالي للعملية الحالية ، وعادة ما يتم تسميته وفقًا لمستخدم خاصية النظام.
إعادة تدوير خاصية. في البداية ، تكون هذه الخاصية خاطئة ، مما يعني أن الإخراج القياسي وإخراج الخطأ لعملية الطفل يتم إرسالهما إلى دفقين مستقلين يمكن الوصول إليه من خلال العملية. إذا تم تعيين القيمة على صواب ، يتم دمج الخطأ القياسي مع الإخراج القياسي. هذا يجعل من السهل ربط رسائل الخطأ والإخراج المقابل. في هذه الحالة ، يمكن قراءة البيانات المدمجة من الدفق الذي تم إرجاعه بواسطة Process.getInputStream () ، بينما سيصل الدفق من Process.GeterRorStream () إلى نهاية الملف مباشرة.
سيؤثر تعديل خصائص شركة Builder على العمليات اللاحقة التي تبدأها طريقة () start () للكائن ، ولكنها لن تؤثر أبدًا على العمليات التي بدأت مسبقًا أو Java نفسها. يتم تنفيذ معظم عمليات فحص الأخطاء بواسطة طريقة Start (). يمكن تعديل حالة الكائن ، ولكن ستفشل () في هذا الطريق. على سبيل المثال ، لن يلقي تعيين خاصية الأمر على قائمة فارغة استثناء ما لم يتم تضمين START ().
لاحظ أن هذه الفئة ليست متزامنة. إذا وصلت مؤشرات الترابط المتعددة إلى مجموعة من المعالجة في نفس الوقت ، وعلى الأقل واحدة من مؤشرات الترابط تعديل أحد الخصائص ، فيجب أن تحافظ على التزامن الخارجي.
ملخص أساليب البناء
ProcessBuilder (قائمة <String>)
بناء مولد العملية باستخدام برامج نظام التشغيل المحددة والمعلمات.
ProcessBuilder (String ... الأمر)
بناء مولد العملية باستخدام برامج نظام التشغيل المحددة والمعلمات.
ملخص الطريقة
قائمة <Tring> command ()
إرجاع برامج نظام التشغيل ومعلمات مولد العملية هذا.
أمر ProcessBuilder (قائمة <String>)
يعين برامج نظام التشغيل ومعلمات مولد العملية هذا.
أمر ProcessBuilder (أمر ... أمر)
يعين برامج نظام التشغيل ومعلمات مولد العملية هذا.
دليل الملف ()
إرجاع دليل العمل لمولد العملية هذا.
دليل ProcessBuilder (دليل الملفات)
يعين دليل العمل لهذا المولد العملية.
خريطة <سلسلة ، سلسلة> بيئة ()
إرجاع عرض تعيين سلسلة من بيئة مولد العملية هذه.
Boolean RedirecterRorStream ()
إخطار مولد العملية ما إذا كان سيتم دمج الأخطاء القياسية والإخراج القياسي.
إعادة تجهيزات عملية إعادة التشغيل (RedirecterRorStream)
يضبط خاصية إعادة توجيه هذا المولد.
بدء العملية ()
ابدأ عملية جديدة باستخدام خصائص مولد العملية هذا.
1.2 وقت التشغيل
يحتوي كل تطبيق Java على مثيل فئة وقت التشغيل ، مما يسمح للتطبيق بالاتصال بالبيئة التي يتم تشغيلها. يمكن الحصول على وقت التشغيل الحالي من خلال طريقة getRuntime.
لا يمكن للتطبيقات إنشاء مثيلات فئة وقت التشغيل الخاص بها. ومع ذلك ، يمكنك استخدام طريقة getRuntime للحصول على المرجع إلى كائن وقت التشغيل الحالي. بمجرد الحصول على مرجع إلى كائن وقت التشغيل الحالي ، يمكنك استدعاء طريقة كائن وقت التشغيل للتحكم في الحالة وسلوك الجهاز الظاهري Java.
رمز تجميع رمز Java
void addshutdownhook (خطاف الخيط)
قم بتسجيل جهاز افتراضي جديد لإيقاف الخطاف.
int AvailivingProcessors ()
إرجاع عدد المعالجات المتاحة إلى الجهاز الظاهري Java.
عملية exec (أمر سلسلة)
قم بتنفيذ أمر السلسلة المحدد في عملية منفصلة.
عملية exec (سلسلة [] cmdarray)
تنفيذ الأوامر المحددة والمتغيرات في عملية منفصلة.
Process Exec (String [] cmdarray ، string [] envp)
تنفيذ الأوامر المحددة والمتغيرات في عملية منفصلة للبيئة المحددة.
Process Exec (String [] cmdarray ، string [] envp ، file dir)
تنفيذ الأوامر والمتغيرات المحددة في عمليات منفصلة في البيئة المحددة ودليل العمل.
عملية exec (أمر سلسلة ، سلسلة [] envp)
قم بتنفيذ أمر السلسلة المحدد في عملية منفصلة للبيئة المحددة.
عملية exec (أمر سلسلة ، سلسلة [] envp ، ملف dir)
قم بتنفيذ أمر السلسلة المحدد في عملية منفصلة مع بيئة محددة ودليل عمل.
خروج باطل (حالة int)
قم بإنهاء جهاز Java Virtual الحالي عن طريق بدء تشغيل تسلسل إيقاف تشغيل الجهاز الظاهري.
فريميموري طويل ()
إرجاع مقدار الذاكرة المجانية في الجهاز الظاهري Java.
باطل GC ()
تشغيل جامع القمامة.
InportStream getLocalizeInputStream (InputStream in)
عفا عليها الزمن. بدءًا من JDK 1.1 ، تتمثل الطريقة المفضلة لتحويل دفق بايت مشفر محليًا إلى دفق حرف Unicode في استخدام فئات InputStreamReader و Bufferrederer.
outputStream getLocalizedOutputStream (OutputStream Out)
عفا عليها الزمن. بدءًا من JDK 1.1 ، تتمثل الطريقة المفضلة لتحويل دفق أحرف Unicode إلى دفق بايت مشفر محليًا في استخدام فئات OutputStreamWriter و BufferedWriter و PrintWriter.
وقت التشغيل الثابت getRuntime ()
إرجاع كائن وقت التشغيل المرتبط بتطبيق Java الحالي.
توقف باطل (حالة int)
إنهاء قسري الجهاز الظاهري جافا الذي يعمل حاليًا.
تحميل باطل (اسم ملف السلسلة)
يقوم بتحميل اسم الملف المحدد كمكتبة ديناميكية.
loadlibrary void (سلسلة libname)
يقوم بتحميل مكتبة ديناميكية مع اسم المكتبة المحدد.
Maxmemory Long ()
إرجاع أقصى قدر من الذاكرة يحاول جهاز Java Virtual استخدامه.
removeshutdownhook المنطقية (خطاف الخيط)
قم بإلغاء التسجيل جهاز افتراضي مسجل مسبقًا لإيقاف الخطاف.
باطلة التركيب ()
يدير طريقة إنهاء جميع الكائنات التي تعلق الانتهاء.
باطلة ثابتة runfinizersonexit (القيمة المنطقية)
عفا عليها الزمن. هذه الطريقة نفسها غير آمنة. قد يستدعي الطريقة النهائية على الكائن المستخدم ، بينما تعمل مؤشرات الترابط الأخرى على تلك الكائنات ، مما يؤدي إلى سلوك غير صحيح أو مسدود.
TotalMemory الطويل ()
إرجاع المبلغ الإجمالي للذاكرة في الجهاز الظاهري Java.
traceinstructions باطلة (منطقية على)
تمكين/تعطيل تتبع الأوامر.
باطلة tracemethodcalls (منطقية على)
تمكين/تعطيل تتبع المكالمات.
1.3 عملية
بغض النظر عن الطريقة التي يتم استخدامها لبدء العملية ، فإن مثيل فئة العملية يمثل عملية البدء سيتم إرجاعها ، والتي يمكن استخدامها للتحكم في العملية والحصول على المعلومات ذات الصلة. توفر فئة العملية طرقًا للتنفيذ من إدخال العملية ، وإخراج التنفيذ للمعالجة ، وانتظار إكمال العملية ، والتحقق من حالة خروج العملية ، وتدمير (قتل) العملية:
تدمير باطل ()
اقتل عملية الطفل.
بشكل عام ، لا يمكن لهذه الطريقة قتل العملية التي بدأت ، لذلك من الأفضل عدم استخدامها.
int exitvalue ()
إرجاع قيمة الخروج من عملية الطفل.
لن يكون طريقة ExitValue () قيمة عودة عادية إلا بعد أن تكمل عملية بدء التشغيل تنفيذها أو الخروج منها بسبب استثناء ، وإلا سيتم طرح استثناء.
InportStream GeterRorStream ()
يحصل على دفق الخطأ لعملية الطفل.
إذا تم إعادة توجيه إخراج الخطأ ، فلا يمكن قراءة إخراج الخطأ من الدفق.
InputStream getInputStream ()
يحصل على دفق الإدخال لعملية الطفل.
يمكن قراءة الإخراج القياسي للعملية من هذا الدفق.
OutputStream getOutputStream ()
يحصل على دفق الإخراج لعملية الطفل.
يتم استخدام البيانات المكتوبة إلى الدفق كمدخلات قياسية للعملية.
int waitfor ()
يؤدي إلى انتظار مؤشر الترابط الحالي ، إذا لزم الأمر ، حتى يتم إنهاء العملية التي يمثلها كائن العملية.
2. أمثلة برمجة متعددة العمليات
بشكل عام ، عندما نقوم بتشغيل طرق في فئات أخرى في Java ، سواء كانت مكالمات ثابتة أو ديناميكية ، يتم تنفيذها في العملية الحالية ، أي أن هناك مثيلًا واحدًا من الجهاز الظاهري Java يعمل. في بعض الأحيان ، نحتاج إلى بدء عمليات تخفيضات متعددة Java من خلال كود Java. على الرغم من أن هذا الأمر يتناول بعض موارد النظام ، إلا أنه سيجعل البرنامج أكثر استقرارًا لأن البرنامج الذي بدأه تم تشغيله حديثًا في عمليات آلية افتراضية مختلفة.
في Java يمكننا استخدام طريقتين لتحقيق هذا المطلب. أسهل طريقة هي تنفيذ اسم Java ClassName من خلال طريقة EXEC في وقت التشغيل. إذا كان التنفيذ ناجحًا ، فإن هذه الطريقة تُرجع كائن العملية. لنلقي نظرة على مثال بسيط أدناه.
// test1.java file import java.io.*؛ اختبار الفئة العامة {public static void main (string [] args) {fileOutputStream fout = newOutputStream ("c: // test1 .txt") ؛ ؛ exec ("جافا اختبار 1") ؛بعد تشغيل البرنامج من خلال Java Test_exec ، وجدت أن هناك ملف Test1.txt إضافي على محرك C ، لكن معلومات الإخراج "تسمى بنجاح!" لذلك ، يمكن استنتاج أن الاختبار قد تم تنفيذه بنجاح ، ولكن لسبب ما ، لا يتم إخراج معلومات الإخراج من الاختبار في وحدة التحكم في Test_Exec. هذا السبب بسيط للغاية ، لأن عملية الطفل Test_exec يتم إنشاؤها باستخدام EXEC.
إذا كنت ترغب في إخراج معلومات الإخراج من عملية الطفل ، فيمكنك الحصول على دفق الخرج لعملية الطفل من خلال GetInputStream في العملية (الإخراج في عملية الطفل ، والإدخال في العملية الأصل) ، ثم نقل دفق الخرج للطفل العملية من إخراج وحدة التحكم في العملية. رمز التنفيذ المحدد كما يلي:
// test_exec_out.javaimport java.io = BufferEdInputStream (P.GetInptream) ؛ ؛
كما يتضح من الكود أعلاه ، في test_exec_out.java ، تتم قراءة معلومات الإخراج من عملية الطفل بواسطة الصف ، ثم يتم تنفيذ الإخراج في كل سطر في test_exec_out. المناقشة أعلاه هي كيفية الحصول على معلومات الإخراج من عملية الطفل. ثم ، بالإضافة إلى معلومات الإخراج ، هناك أيضًا معلومات إدخال. نظرًا لأن عملية الطفل لا تحتوي على وحدة تحكم خاصة بها ، يجب أيضًا توفير معلومات الإدخال من قبل العملية الأصل. يمكننا توفير معلومات الإدخال لعملية الطفل من خلال طريقة عملية GetOutputStream (أي معلومات الإدخال من العملية الأصل إلى عملية الطفل ، بدلاً من معلومات الإدخال من وحدة التحكم). يمكننا أن ننظر إلى الكود التالي:
// test2.java file import java.io.*؛ اختبار الفئة العامة {public static void main (string [] "المعلومات التي أدخلتها العملية الأصل:" + Br.ReadLine ()) ؛ . Flush () ؛ من الكود أعلاه ، يمكننا أن نرى أن Test1 يحصل على المعلومات المرسلة بواسطة test_exec_in وإخراجها. عندما لا تضيف bw.flash () و bw.close () ، لن تصل المعلومات إلى عملية الطفل ، مما يعني أن عملية الطفل تدخل في حالة حظر ، ولكن منذ خروج عملية الوالدين ، تخرج عملية الطفل أيضًا . إذا كنت ترغب في إثبات ذلك ، يمكنك إضافة System.in.Read () في النهاية ثم عرض عملية Java من خلال مدير المهام (تحت Windows) ، وسوف تجد أنه إذا قمت بإضافة bw.flush () و BW .Close () ، توجد عملية Java واحدة فقط ، إذا تمت إزالتها ، توجد عمليتان Java. هذا لأنه إذا تم تمرير المعلومات إلى Test2 ، فإن Test2 يخرج بعد الحصول على المعلومات. إليك شيء واحد يجب شرحه بأن تنفيذ EXEC غير متزامن ولن يتوقف عن تنفيذ الكود التالي لأنه يتم حظر برنامج معين يتم تنفيذه. لذلك ، بعد تشغيل Test2 ، لا يزال من الممكن تنفيذ الكود التالي.
تم إعادة تحميل طريقة EXEC عدة مرات. ما هو مستخدم أعلاه هو مجرد حمولة زائدة منه. يمكن أيضًا فصل الأوامر والمعلمات ، مثل exec ("java.test2") يمكن كتابتها على أنها exec ("Java" ، "Test2"). يمكن لـ EXEC أيضًا تشغيل أجهزة Java الظاهرية مع تكوينات مختلفة من خلال متغيرات البيئة المحددة.
بالإضافة إلى استخدام طريقة EXEC في وقت التشغيل لبناء عملية طفل ، يمكنك أيضًا إنشاء عملية طفل من خلال ProcessBuilder. إن استخدام ProcessBuilder هو كما يلي:
// test_exec_out.javaimport java.io.*؛ الفئة العامة test_exec_out {public static void main (string [] ؛عند إنشاء عمليات الطفل ، يشبه ProcessBuilder وقت التشغيل. بعد الحصول على العملية ، عملياتها هي نفسها بالضبط.
مثل وقت التشغيل ، يمكن لـ ProcessBuilder أيضًا تعيين معلومات البيئة ، ودليل العمل ، إلخ. من الملف القابل للتنفيذ. يصف المثال التالي كيفية تعيين هذه المعلومات باستخدام ProcessBuilder.
ProcessBuilder pb = new ProcessBuilder ("command" ، "arg2" ، "arg2" ، '' ') ؛ // set البيئة خريطة متغير <string ، env> env = pb.environment () ؛ env.put ("key1" ، ::::::::::::::::::::::::: :::::::::::::::::::::: ::::::::::::::::::::::::: :::::::::::::::::::::: ::::::::::::::::::::::::::::: ::::: "value1") ؛ env.remove ("key2") ؛ env.put ("key2" ، env (env .