Latest web development tutorials

جافا متعددة الخيوط البرمجة

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

خاصية تعدد هو شكل خاص من أشكال متعددة المهام، متعدد خيوط، ولكن استخدام الموارد العامة أصغر.

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

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


دورة الحياة والترابط

الموضوع من خلال جميع مراحل دورة حياتها. ويوضح الشكل التالي دورة الحياة الكاملة للموضوع.

java_thread

  • الحالة الجديدة:

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

  • استعداد الدولة:

    عندما كائن موضوع استدعاء الأسلوب بداية ()، وموضوع في حالة استعداد. موضوع جاهزة في قائمة الانتظار على استعداد، لانتظار جدولة جدولة موضوع JVM.

  • وضع التشغيل:

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

  • منعت الدولة:

    إذا تم إعدام موضوع بعد النوم (النوم)، وتعليق (تعليق) وغيرها من الأساليب، وفقدان الموارد المحتلة، وموضوع يدخل في حالة منعت من الترشح. بعد حان وقت النوم للحصول على معدات وموارد لإعادة إدخال حالة استعداد.

  • حالة وفاة:

    عندما يحدث موضوع تشغيل حالة مهمة أو أخرى إنهاء حالة، يتم تبديل موضوع للدولة نهاية.


أولوية والترابط

كل موضوع جاوة له أولوية، مما يساعد على تحديد نظام التشغيل ترتيب موضوع الجدولة.

الأولوية موضوع جاوة هو عدد صحيح والذي يتراوح من 1 (Thread.MIN_PRIORITY) - 10 (Thread.MAX_PRIORITY).

افتراضيا، يتم تعيين كل موضوع على NORM_PRIORITY الأولوية (5).

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


إنشاء موضوع

يوفر جافا طريقتين لإنشاء موضوع:

  • Runable من خلال تنفيذ واجهة.
  • من خلال الميراث الطبقة الموضوع نفسه.

لخلق موضوع من خلال تنفيذ واجهة Runnable

إنشاء موضوع، وأسهل طريقة لإنشاء فئة التي تطبق الواجهة Runnable.

من أجل تحقيق Runnable، فئة يحتاج فقط تنفيذ تشغيل استدعاء الأسلوب ()، البيان التالي:

public void run()

يمكنك تجاوز هذا الأسلوب، فإنه من المهم أن نفهم المدى () يمكن استدعاء أساليب أخرى، واستخدام الطبقات الأخرى، وتعريف متغير، كما أن موضوع الرئيسي.

بعد إنشاء فئة تنفذ واجهة Runnable، يمكنك إنشاء مثيل كائن في فئة الموضوع.

ويحدد موضوع عدة منشئات، تتبع هذا نحن غالبا ما تستخدم:

Thread(Runnable threadOb,String threadName);

هنا، threadOb هو مثيل من الفئة التي تطبق الواجهة Runnable، وthreadName تحديد اسم جديد في الموضوع.

بعد إنشاء موضوع جديد، يمكنك استدعاء منهجه بداية () أنه سيتم تشغيل.

void start();

أمثلة

هنا هو مثيل لإنشاء موضوع وبدء تنفيذ:

// 创建一个新的线程
class NewThread implements Runnable {
   Thread t;
   NewThread() {
      // 创建第二个新线程
      t = new Thread(this, "Demo Thread");
      System.out.println("Child thread: " + t);
      t.start(); // 开始线程
   }
  
   // 第二个线程入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            // 暂停线程
            Thread.sleep(50);
         }
     } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
     }
     System.out.println("Exiting child thread.");
   }
}
 
public class ThreadDemo {
   public static void main(String args[]) {
      new NewThread(); // 创建一个新线程
      try {
         for(int i = 5; i > 0; i--) {
           System.out.println("Main Thread: " + i);
           Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}

تجميع يعمل البرنامج المذكور على النحو التالي:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

لإنشاء موضوع عن طريق الإرث الموضوع

والطريقة الثانية لإنشاء موضوع هو خلق فئة جديدة يرث الطبقة الموضوع، ومن ثم إنشاء مثيل من فئة.

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

أمثلة

// 通过继承 Thread 创建线程
class NewThread extends Thread {
   NewThread() {
      // 创建第二个新线程
      super("Demo Thread");
      System.out.println("Child thread: " + this);
      start(); // 开始线程
   }
 
   // 第二个线程入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
                            // 让线程休眠一会
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
      }
      System.out.println("Exiting child thread.");
   }
}
 
public class ExtendThread {
   public static void main(String args[]) {
      new NewThread(); // 创建一个新线程
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}

تجميع يعمل البرنامج المذكور على النحو التالي:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

طرق الموضوع

يسرد الجدول التالي الطبقة الموضوع بعض الطرق المهمة:

لا. طريقة الوصف
1 بداية باطلة العامة ()
جعل هذا الموضوع للبدء في التنفيذ، آلة جافا الافتراضية تدعو طريقة تشغيل هذا الموضوع.
2 المدى باطلة العامة ()
إذا تم إنشاء هذا الموضوع باستخدام كائن المدى Runnable منفصل، ثم استدعاء الأسلوب تشغيل الكائن Runnable؛ وإلا، وهذه الطريقة لا يفعل شيئا والعوائد.
3 العام النهائي الفراغ setName (اسم سلسلة)
تغيير اسم هذا الموضوع، حتى أن نفس اسم المعلمة.
4 الجمهور نهائي الفراغ setPriority (أولوية كثافة العمليات)
تغيير أولوية الموضوع.
5 الجمهور الفراغ setDaemon النهائي (منطقية على)
يصادف هذا الموضوع باعتباره موضوع الخفي أو موضوع المستخدم.
6 الفراغ النهائي العام انضمام (millisec الطويل)
انتظر هذا الموضوع إلى حد أقصى قدره بالمللي ميلي ثانية.
7 المقاطعة باطلة العامة ()
موضوع توقف.
8 isAlive منطقية النهائي العام ()
اختبارات إذا هذا الموضوع نشط.

اختبارات إذا هذا الموضوع نشط. ويطلق على الأسلوب أعلاه الكائن الموضوع. الأسلوب التالي هو أسلوب ثابت من الطبقة الموضوع.

لا. طريقة الوصف
1 العام العائد باطل ثابت ()
تعليق الكائن موضوع تنفذ حاليا، وتنفيذ المواضيع الأخرى.
2 العام النوم باطل ثابت (millisec الطويل)
ضمن عدد محدد من ميلي ثانية تنفذ حاليا موضوع للنوم (تنفيذ وقف)، وهذا نظام التشغيل توقيت والمنظمون من دقة ودقة.
3 الجمهور holdsLock منطقية ثابتة (كائن خ)
إذا وفقط إذا كان الترابط الحالي يحمل قفل الشاشة على الكائن المحدد، فإنه يعود صحيحا.
4 العام ساكنة الموضوع currentThread ()
تقوم بإرجاع مرجع إلى كائن موضوع تنفذ حاليا هي.
5 الجمهور dumpStack الفراغ ثابت ()
طباعة تتبع مكدس مؤشر الترابط الحالي إلى تيار الخطأ المعياري.

أمثلة

يوضح البرنامج التالي بعض الطرق ThreadClassDemo الطبقة الموضوع:

// 文件名 : DisplayMessage.java
// 通过实现 Runnable 接口创建线程
public class DisplayMessage implements Runnable
{
   private String message;
   public DisplayMessage(String message)
   {
      this.message = message;
   }
   public void run()
   {
      while(true)
      {
         System.out.println(message);
      }
   }
}
// 文件名 : GuessANumber.java
// 通过继承 Thread 类创建线程

public class GuessANumber extends Thread
{
   private int number;
   public GuessANumber(int number)
   {
      this.number = number;
   }
   public void run()
   {
      int counter = 0;
      int guess = 0;
      do
      {
          guess = (int) (Math.random() * 100 + 1);
          System.out.println(this.getName()
                       + " guesses " + guess);
          counter++;
      }while(guess != number);
      System.out.println("** Correct! " + this.getName()
                       + " in " + counter + " guesses.**");
   }
}
// 文件名 : ThreadClassDemo.java
public class ThreadClassDemo
{
   public static void main(String [] args)
   {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
     
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();
 
      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try
      {
         thread3.join();
      }catch(InterruptedException e)
      {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
     
           thread4.start();
      System.out.println("main() is ending...");
   }
}

النتائج على النحو التالي، ونتائج كل شوط ليست هي نفسها.

Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Thread-2 guesses 27
Hello
** Correct! Thread-2 in 102 guesses.**
Hello
Starting thread4...
Hello
Hello
..........remaining result produced.

كاتب الموضوع عدة مفاهيم رئيسية هي:

عندما متعددة مؤشرات الترابط البرمجة، تحتاج إلى فهم المفاهيم التالية:

  • تزامن الموضوع
  • التواصل بين المواضيع
  • الجمود الموضوع
  • السيطرة الموضوع: مرحلي، ووقف واستئناف

استخدام المواضيع متعددة

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

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

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