أفضل طريقة لتحديد الخيط المقفل والتخلص منه في جافا

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

  •  28-09-2019
  •  | 
  •  

سؤال

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

لديّ شيء كهذا الآن ، لكنني لست متأكدًا مما إذا كانت هذه هي أفضل طريقة للقيام بذلك وأريد تجنب استدعاء Thread.stop () كما تم إهمالها. شكرًا.

private void foo() throws Exception
{
        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };
        Thread thread;
        thread = new Thread(runnable);
        thread.start();
        thread.join(3500);
        if (thread.isAlive())
        {
            thread.stop();
            throw new Exception();
        }

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

المحلول

public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }

انظر هذا الرابط حول كيفية إيقاف الموضوع ، يغطي الموضوع جيدًا

نصائح أخرى

لا توجد طريقة لفعل ما تريد (دون قيد أو شرط). على سبيل المثال إذا كان stuff that could potentially lock up the thread. يبدو أن هذا ، لا توجد طريقة لإيقافه ، أقل من System.exit ():

public void badStuff() {
 while (true) {
  try {
   wait();
  }
  catch (InterruptedException irex) {
  }
 }
}

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

سوف أنظر في java.util.concurrent Executor الإطار وتحديدا Future<T> واجهه المستخدم. مع هذه ، يتم تجريدك إلى حد ما من تقلبات java.lang.thread ، وستحصل على فصل جيد لما هي المهام من كيفية تشغيلها (سواء على خيط منفصل ، سواء كان الخيط يأتي من تجمع يطير ، إلخ)

مثيل مستقبلي ، على الأقل ، يمنحك isDone و isCancelled طُرق.

ال ExecutorService (واجهة فرعية من Executor) يمنحك بعض الوسائل لإغلاق أي مهام خارجية. أو تحقق من ExecutorService.awaitTermination(long timeout, TimeUnit unit) طريقة

private void foo() throws Exception
{
        ExecutorService es = Executors.newFixedThreadPool(1);

        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };

        Future result = es.submit(runnable);

        es.awaitTermination(30, TimeUnit.SECONDS);

        if (!result.isDone()){
            es.shutdownNow();
        }

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