හොඳයි බොහෝ හොඳ පිළිතුරු, මට මේ ගැන තවත් එකතු කිරීමට අවශ්යයි. මෙය තේරුම් ගැනීමට උපකාරී වේ Extending v/s Implementing Thread
.
විස්තාරණය කිරීම පන්ති ලිපිගොනු දෙකක් ඉතා සමීපව බැඳ තබන අතර කේත සමඟ කටයුතු කිරීමට තරමක් අපහසු වේ.
ප්රවේශයන් දෙකම එකම කාර්යයක් කරන නමුත් යම් වෙනස්කම් තිබේ.
වඩාත් පොදු වෙනස වන්නේ
- ඔබ නූල් පන්තිය දීර් extend කරන විට, ඔබට අවශ්ය වෙනත් පන්තියක් දීර් extend කළ නොහැක. (ඔබ දන්නා පරිදි, ජාවා එක් පන්තියකට වඩා උරුම කර ගැනීමට ඉඩ නොදේ).
- ඔබ Runnable ක්රියාත්මක කරන විට, අනාගතයේදී හෝ දැන් වෙනත් පන්තියක් දීර් extend කිරීමට ඔබේ පන්තියට ඉඩ ඉතිරි කර ගත හැකිය.
කෙසේ වෙතත්, ධාවනය කළ හැකි සහ නූල් දිගු කිරීම අතර ඇති එක් සැලකිය යුතු වෙනසක් එයයි
by extending Thread, each of your threads has a unique object associated with it, whereas implementing Runnable, many threads can share the same object instance.
පහත උදාහරණය වඩාත් පැහැදිලිව තේරුම් ගැනීමට ඔබට උපකාරී වනු ඇත
//Implement Runnable Interface...
class ImplementsRunnable implements Runnable {
private int counter = 0;
public void run() {
counter++;
System.out.println("ImplementsRunnable : Counter : " + counter);
}
}
//Extend Thread class...
class ExtendsThread extends Thread {
private int counter = 0;
public void run() {
counter++;
System.out.println("ExtendsThread : Counter : " + counter);
}
}
//Use the above classes here in main to understand the differences more clearly...
public class ThreadVsRunnable {
public static void main(String args[]) throws Exception {
// Multiple threads share the same object.
ImplementsRunnable rc = new ImplementsRunnable();
Thread t1 = new Thread(rc);
t1.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
Thread t2 = new Thread(rc);
t2.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
Thread t3 = new Thread(rc);
t3.start();
// Creating new instance for every thread access.
ExtendsThread tc1 = new ExtendsThread();
tc1.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
ExtendsThread tc2 = new ExtendsThread();
tc2.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
ExtendsThread tc3 = new ExtendsThread();
tc3.start();
}
}
ඉහත වැඩසටහනේ ප්රතිදානය.
ImplementsRunnable : Counter : 1
ImplementsRunnable : Counter : 2
ImplementsRunnable : Counter : 3
ExtendsThread : Counter : 1
ExtendsThread : Counter : 1
ExtendsThread : Counter : 1
ධාවනය කළ හැකි අතුරුමුහුණත් ප්රවේශයේදී, පන්තියක එක් අවස්ථාවක් පමණක් නිර්මාණය වන අතර එය විවිධ නූල් මගින් බෙදාගෙන ඇත. එබැවින් සෑම නූල් ප්රවේශයක් සඳහාම කවුන්ටරයේ වටිනාකම වැඩි වේ.
ත්රෙඩ් පංති ප්රවේශය වන අතර, සෑම නූල් ප්රවේශයක් සඳහාම වෙනම අවස්ථාවක් නිර්මාණය කළ යුතුය. එබැවින් සෑම පන්ති අවස්ථාවන් සඳහාම වෙනස් මතකයක් වෙන් කර ඇති අතර සෑම එකක්ම වෙනම කවුන්ටරයක් ඇත, අගය එක හා සමාන වේ, එයින් අදහස් වන්නේ කිසිදු වස්තුවක් යොමු නොවන බැවින් වර්ධකයක් සිදු නොවන බවයි.
ධාවනය කළ හැකි භාවිතා කරන්නේ කවදාද?
නූල් සමූහයෙන් එකම සම්පත් වෙත ප්රවේශ වීමට ඔබට අවශ්ය විට ධාවනය කළ හැකි අතුරු මුහුණත භාවිතා කරන්න. මෙහි නූල් පන්තිය භාවිතා කිරීමෙන් වළකින්න, මන්ද බහු වස්තු නිර්මාණය වැඩි මතකයක් පරිභෝජනය කරන අතර එය ඉහළ කාර්ය සාධනයක් බවට පත්වේ.
Runnable ක්රියාත්මක කරන පන්තියක් නූල් සහ පන්තියක් නොවේ. ධාවනය කළ හැකි නූලක් බවට පත්වීම සඳහා, ඔබ නූල් පිළිබඳ උදාහරණයක් නිර්මාණය කර ඉලක්කය ලෙස ඉදිරියට යා යුතුය.
බොහෝ අවස්ථාවන්හීදී, ධාවනය කළ හැකි අතුරුමුහුණත භාවිතා කළ යුත්තේ ඔබ run()
ක්රමවේදය ඉක්මවා යාමට සැලසුම් කරන්නේ නම් සහ වෙනත් නූල් ක්රම නොමැති නම් පමණි . මෙය වැදගත් වන්නේ පංතියේ මූලික හැසිරීම වෙනස් කිරීමට හෝ වැඩි දියුණු කිරීමට ක්රමලේඛකයා අදහස් කරන්නේ නම් මිස පන්ති උප කාණ්ඩයට නොගත යුතු බැවිනි.
සුපිරි පන්තියක් දීර් extend කිරීමේ අවශ්යතාවයක් ඇති විට, නූල් පන්තිය භාවිතා කිරීමට වඩා ධාවනය කළ හැකි අතුරු මුහුණත ක්රියාත්මක කිරීම වඩාත් යෝග්ය වේ. නූල් සෑදීම සඳහා ධාවනය කළ හැකි අතුරුමුහුණත ක්රියාත්මක කරන අතරතුර අපට වෙනත් පන්තියක් දීර් extend කළ හැකි බැවිනි.
මම හිතනවා මේක උදව් වෙයි කියලා!