سؤال

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

يبدو الموضوع الرئيسي مثل هذا:

final Thread t = new Thread()
{
    @Override
    public void run()
    {
        f();
    }
};
t.start();
try
{
    t.join(time);
    t.interrupt();
    if(t.isAlive())
    {
        t.join(allowance);
        if(t.isAlive())
            throw new Exception();
    }
}
catch(Exception e)
{
    System.err.println("f did not terminate in the alloted time");
}

ويحتوي الخيط الناتج على مجموعة مما يلي منتشرة في الكود الخاص به:

if(Thread.interrupted()) return;

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

هل يعرف أحد ما أفعله خطأ؟

ملحوظة:أنا أستخدم Ubuntu وأنا جديد تمامًا على أي شيء يعمل بنظام Linux.هل يمكن أن تكون المشكلة مع نظام التشغيل؟لم أختبر الكود على أي نظام تشغيل آخر.

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

المحلول

وأقترح عليك أن تنظر في استخدام ExecutorService الذي يهدف إلى قيام هذا النوع من الشيء ويمكن أن تساعدك بطرق أخرى.

ExecutorService service = Executors.newCachedThreadPool();
Future<ResultType> future = service.submit(new Callable<ResultType() {
   public ResultType call() throws Exception {
      // do soemthing
      return (ResultType) ...;
   }
);
// do anything you like until you need to result.
try {
   ResultType result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException timedOut) {
  // handle exception
  // cancel the task, interrupting if still running.
  result.cancel(true);
} catch (ExecutionException taskThrewAnException) {
  // handle exception
}
// when you have finished with the service, which is reusable.
service.shutdown();

نصائح أخرى

وهنا تخميناتي:

  • عندما يستدعي الموضوع الرئيسي t.interrupt(); لقد انتهى الخيط t من التنفيذ بالفعل.
  • عندما يستدعي الموضوع الرئيسي t.interrupt(); في سلسلة الرسائل t، لا يوجد المزيد من المكالمات للتحقق منها interrupted() علَم.
  • هل حصلت على الاستثناء نتيجة تشغيل الكود؟هل تحصل على الاستثناء الذي تضعه في الكود الخاص بك بعد وقت "البدل" أم أنك حصلت على شيء آخر مثل ThreadInterruptedException أو مشابه؟حاول كتابة رسالة الاستثناء الذي تم اكتشافه ...

هل لديك متداخلة الشيكات من Thread.interrupted ()؟ هذا الأسلوب يزيل العلم توقف، وبالتالي فإن الدعوة الثانية ترجع كاذبة. هل يمكن استخدام isInterrupted () بدلا من ذلك.

ويبدو كما لو لم يتم التوصل الدعوة Thread.interrupted () في و ().

ومن المرجح أن يكون سلوك مختلفة كنت ترى في أوضاع التصحيح وتشغيل نظرا لوجود حالة تعارض.

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