أولاً : مفهوم 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 .