هل هناك أي شيء خطير حول استخدام Thread.currentThread.sleep () في قانون بلدي الرئيسي؟

StackOverflow https://stackoverflow.com/questions/640464

  •  11-07-2019
  •  | 
  •  

سؤال

وفي قانون بلدي أنا باستخدام

Thread.currentThread().sleep(sleepTime);

وفي (غير كائن الموضوع) الجزء الرئيسي من التعليمات البرمجية.

ويبدو أن تعمل بشكل جيد، ولكن أنا قلقة أنه قد يكون هناك بعض الأكمة ما وراءها من شأنها أن لدغة لي في وقت لاحق من الحمار.

هل هناك طريقة أفضل لجعل عملية الرئيسية الخاصة بك الجلوس حولها لبعض الوقت؟ أو هل هذه هي المنهجية المحددة؟

وتحرير:

في الإجابة على لماذا أنا أفعل ذلك بهذه الطريقة ...

ولدي العملية التي يربط طريق HTTP أو FTP المضيفين البعيدين ويفعل الاشياء.

في بعبارة أخرى ...

والاشياء ...

والاتصال عن بعد ...

وتفعل أشياء مع اتصال بعيد ...

وصلة وثيقة ...

والمزيد من الأشياء ...

وكرر حسب الضرورة.

ولقد وجدت أنه في حالات نادرة جدا جدا، الاتصال يذهب إلى قبالة لا أرض لوس انجليس. فإنه لا تفشل، فإنه لا رمي أي استثناء، فإنه يذهب بعيدا. وانها تسد، لذلك ليس هناك طريقة في خط لتحديد توقيت.

وهكذا، يا الحل هو أن تفعل هذا ...

والاشياء ...

وبدء موضوع جديد مع الاتصال في ذلك ...

ويذهب في حلقة لا نهائية مع جهاز توقيت في عملية الرئيسية (وليس في موضوع ولدت) وانتظر إما

وأ) موضوع اتصال لاستكمال مهمتها وتعيين بعض العلم إلى "القيام به"

أو

وب) الانتظار بعض مبلغ محدد مسبقا من الوقت وإذا لم تبلغ الخيط الصدد إلى أن كل شيء قد انتهى، وقتل هو والمضي قدما.

وهو في عملية الرئيسية التي أنوي النوم لبعض الوقت، تستيقظ، ومعرفة ما اذا انتهت مدة صلاحية MAX_WAIT_TIME. إن لم يكن، والعودة إلى النوم وانتظر بعض أكثر.

ويبدو أكثر كفاءة (على المعالج) من الجلوس في مستوى حين حلقة، لأن ذلك يتعارض حقا مع قطاع الأعمال في موضوع الاتصال من القيام بما يتعين عليها القيام به.

وأعتقد سؤالي هو حقا ... هل هناك أي شيء غير آمن عن هذا النهج. أرى من الإجابات التي، نظرا لما أفعله، يبدو أن هناك ليست كذلك. ربما كان يجب أن سئل عما اذا كان هناك نهج أكثر توحيدا؟

هل كانت مفيدة؟

المحلول

وليس هناك شرك. وسوف النوم لطالما كنت أقول ذلك ل.

وقد أو قد لا يكون هناك شرك في فكرة التطبيق الخاص بك النوم لفترة طويلة من الزمن.

نصائح أخرى

ما هو نوع من التطبيق هي الكتابة؟ انها نادرا ما تكون فكرة جيدة، وانها <م> خاصة فكرة سيئة إذا كنت تكتب واجهة المستخدم الرسومية العميل - في حين أن موضوع هو النوم، وانها لن تكون متجاوبة

إذا كنت يمكن أن يعطي أكثر من دلالة لماذا تحتاج إلى وقفة ونوع التطبيق الذي كنت تكتب، من شأنه أن يساعد.

وشيء آخر - مكالمتك ينبغي أن يكون حقا:

Thread.sleep(sleepTime);

واصفا إياه بأنه عبر currentThread() يجعل من نظر مثل انها أسلوب مثيل، ولكنها ليست - انها مجرد أسلوب ثابت العادي. لا يمكن أن تجعل أي البعض موضوع النوم.

ويجب عليك معرفة ما إذا كان IDE لديه خيار لجعل استدعاء أساليب ثابتة عبر إشارة إلى تحذير أو خطأ - أنه يؤدي إلى رمز مضللة (مثل هذه)

.

وانها ليست خطيرة، ولكن في 99٪ من الحالات + عندما كنت تعتقد أنك في حاجة إليها، كنت حقا لا. ماذا تحاول أن تفعل؟

حسنا، Thread.sleep هو أسلوب ثابت لذلك هو مضلل جدا. أيضا لا يمكن أن استيقظ نظيفة (هل يمكن أن يقطع، ولكن كنت خلاف أن هذا هو نظيفة) في حال كنت في حاجة إلى العمل لإيقاف.

إذا قررت استخدام <لأ href = "http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#sleep(long)" يختلط = "نوفولو noreferrer" > Thread.sleep ، تأكد من أنك التعامل مع InterruptedException بشكل مناسب .

وماذا تعني الاتصال فقط "يذهب بعيدا"؟ بالتأكيد ليس هناك طريقة مضمنة لتحديد توقيت، ولكن هل يمكن أن يحدد مهلة الاتصال وقراءة مهلة إذا أردت.

وإنشاء مأخذ مع منشئ عدم وسائط، والدعوة ربط (SocketAddress، الباحث) بحيث يمكنك تحديد المهلة (بالملي ثانية). إذا لا يمكن تأسيس الاتصال في ذلك الوقت، تم إلقاء استثناء.

ويمكنك الاتصال setSoTimeout () قبل الاتصال بحيث أن أي دعوات لقراءة () ومنع فقط لمقدار الوقت الذي تحدده، بدلا من ذلك إلى الأبد. إذا لا يمكن قراءة البيانات في الوقت الذي حددته، يتم طرح استثناء.

Thread.sleep() الوقت النفايات وحدة المعالجة المركزية في حين <لأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#wait(long)" يختلط = "نوفولو noreferrer "> Object.wait(long timeout) لا. لذلك ينبغي عليك دائما استخدام Object.wait(long timeout) بدلا من ذلك. على الرغم من أنني لا يمكن العثور على أي اللقطات التي تدعم فرضيتي، أعتقد أنه عندما التحول إلى Object.wait(long timeout) المكالمات تلقينا كسب الأداء واسع.

والناس غالبا ما تستخدم الموقت لأداء الأحداث المتأخرة ولكن يفضل ScheduleExecutorService. يمكنك استخدام حمام السباحة موضوع ذاته لجميع الإجراءات المهلة الخاصة بك. (هل يمكن أن يكون تجمع خيط حجم 1)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top