Multi-threading

أولاً : مفهوم multi-thread :-

هو كيفية تنفيذ عمل أكثر من دالة في أن واحد .   


ثانياً : عمل multi-thread :-

لنتعامل مع عذا المفهوم سنستعين بـ Thread class  الذي يحتوي على العديد من الدوال التي تفيدنا في موضوعنا هذا . مثال :-

class first :Thread() {

    override fun run() {
        var num = 0

        for (i in 1..3) {
            num = num + i
            println(num)
            Thread.sleep(1000)
        }

        println("-----------------------\n The result is :$num")
    }}

class second :Thread() {

    override fun run() {
        var num = 1

        for (i in 1..3) {
            num = num * i
            println(num)
            Thread.sleep(1000)
        }
        println("-----------------------\n The result is :$num")}}

fun main(args:Array<String>){

    var F = first()
    var S = second()

    F.start()
    S.start()
}
  • قمنا بإنشاء تصنيفين مختلفين احدهما لجمع الأرقام الواقعة بين ٠ و ٥ ، وتصنيف لناتج ضرب الأعداد الواقعة بين ٠ و ٥ .
  • تمت عملية الوراثة في التصنيفين من Thread .
  • في كل من التصنيفين استعملنا دالة منشأة في Thread للعمل وتجهيز الأوامر بداخلها وهي run وبما أنها منشأة من قبل في تصنيف Thread فنقوم بعمل override لها .
  • لجعل الدالتين في التصنيفين يعملون بالتزامن بمعنى أننا لن ننتظر دالة run  في تصنيف first للعمل ومن بعد انتهائها ننتقل إلى الدالة run   في التنصيف second ، نستخدم دالة sleep التي نحدد لها الوقت بالـ Millis (milliseconds) ، تقوم هذه الدالة بتعطيل عمل الدالة الحالية مدة زمنية معينة ومن ثم تعود لعملها من جديد .
  • الأن للتحقق من عملنا نقوم بعمل كائن من كلا التصنيفين والعمل بهما .
  • نلاحظ أننا لم نستدعي دالة run لتنفيذها وهذا صحيح لأن المسؤول عن تنفيذها هي الدالة الموضحة بالمثال وهي start : start() .

 

ناتج التنفيذ :-

1
1
3
2
6
6
———————–
The result is :6
———————–
The result is :6


ثالثاً: الدوال التي تعمل مع thread :-

Start :-

  • يعود بقيمة منطقية
  • إذا كانت قيمته true يتم تشغيل الـ thread .

run :-

  • لكتابة الأوامر التي سيتم تنفيذها عند عمل start لـ Thread .

sleep :-

  • لإيقاف عمل الدالة مدة معينه نقوم بتحديدها بالـ milliseconds .

Suspend :-

  • لإيقاف عمل الدالة مدة غير محددة ، ولاستئناف عملها نقوم باستدعاء الدالة resume .

resume :-

  • تكمل تنفيذ الأوامر التي توقفت بسبب الدالة Suspend.

stop :-

  • توقف عمل الكائن الذي يرث Thread .

id :-

  • للحصول على id الخاص بكائن Thread .

setName :-

  • لتعيين اسم بالكائن الخاص بـ Thread .

getName :-

  • للحصول على اسم الكائن الخاص بـ Thread .

getPriority :-

  • يعود بقيمة من ١-١٠ .
  • يعبر عن الأولوية التي يمتلكها الكائن الخاص بـ Thread .
  • الأولوية الافتراضية هي ٥ ولكن لو أردنا تغيير قيمتها نستخدم setPriority التي تسمح لنا بتعيين قيمة جديدة للأولوية .

 

toString :-

  • تعود بمجموعة من المعلومات عن الكائن الخاص بـ Thread ( name – id – group).

Interrupt :-

  • لمقاطعة عمل الكائن الخاص بـ Thread .

join :-

  • تهتم بإنجاز جميع الأوامر الخاصة بكائن الـ Thread وبعد الانتهاء منها الانتقال إلى ما تبقى في main .

State :-

  • يعود بحالة كائن الـ Thread .