மற்றொரு வகை நூல் குளம் "கேச்" ஆகும். இத்தகைய நூல் குளங்கள் நிலையானவற்றைப் போலவே பொதுவாகப் பயன்படுத்தப்படுகின்றன.

பெயரால் குறிப்பிடப்பட்டுள்ளபடி, இந்த வகையான த்ரெட் பூல் த்ரெட்களை கேச் செய்கிறது. புதிய பணிகளைச் செய்ய, அந்தத் தொடரிழைகளை மீண்டும் பயன்படுத்த, பயன்படுத்தப்படாத இழைகளை ஒரு குறிப்பிட்ட காலத்திற்கு உயிருடன் வைத்திருக்கும். எங்களிடம் சில நியாயமான அளவு ஒளி வேலை இருக்கும்போது அத்தகைய நூல் குளம் சிறந்தது.

"சில நியாயமான தொகை" என்பதன் பொருள் மிகவும் விரிவானது, ஆனால் அத்தகைய குளம் ஒவ்வொரு பணிகளுக்கும் ஏற்றது அல்ல என்பதை நீங்கள் அறிந்து கொள்ள வேண்டும். உதாரணமாக, நாம் ஒரு மில்லியன் பணிகளை உருவாக்க விரும்புகிறோம் என்று வைத்துக்கொள்வோம். ஒவ்வொன்றும் மிகக் குறைந்த நேரத்தை எடுத்துக் கொண்டாலும், நாம் இன்னும் நியாயமற்ற அளவு வளங்களைப் பயன்படுத்துகிறோம் மற்றும் செயல்திறனைக் குறைக்கிறோம். செயல்படுத்தும் நேரம் கணிக்க முடியாததாக இருக்கும் போது, ​​எடுத்துக்காட்டாக, I/O பணிகளில் இதுபோன்ற குளங்களை நாம் தவிர்க்க வேண்டும்.

ஹூட்டின் கீழ், ThreadPoolExecutor கட்டமைப்பாளர் பின்வரும் வாதங்களுடன் அழைக்கப்படுகிறது:


public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, 
      new SynchronousQueue<Runnable>());
}

பின்வரும் மதிப்புகள் கட்டமைப்பாளருக்கு வாதங்களாக அனுப்பப்படுகின்றன:

அளவுரு மதிப்பு
corePoolSize ( எக்ஸிகியூட்டர் சேவை தொடங்கும் போது எத்தனை நூல்கள் தயாராக இருக்கும் (தொடங்கும்) ) 0
அதிகபட்ச பூல் அளவு ( எக்ஸிகியூட்டர் சேவை உருவாக்கக்கூடிய அதிகபட்ச நூல்கள் ) முழு எண்.MAX_VALUE
KeepAliveTime (இழைகளின் எண்ணிக்கை corePoolSize ஐ விட அதிகமாக இருந்தால், விடுவிக்கப்பட்ட நூல் அழிக்கப்படுவதற்கு முன்பு தொடர்ந்து வாழும் நேரம் ) 60லி
அலகு (நேரத்தின் அலகுகள்) நேரஅலகு.SECONDS
பணிவரிசை (வரிசையை செயல்படுத்துதல்) புதிய SynchronousQueue<இயக்கக்கூடியது>()

நாம் அதே வழியில் ThreadFactory இன் சொந்த செயலாக்கத்தை அனுப்பலாம் .

SynchronousQueue பற்றி பேசலாம்

ஒரு ஒத்திசைவான பரிமாற்றத்தின் அடிப்படை யோசனை மிகவும் எளிமையானது மற்றும் எதிர்-உள்ளுணர்வு (அதாவது, உள்ளுணர்வு அல்லது பொது அறிவு அது தவறு என்று உங்களுக்குச் சொல்கிறது): நீங்கள் ஒரு உறுப்பை வரிசையில் சேர்க்க முடியும் அதே நேரம். வேறு வார்த்தைகளில் கூறுவதானால், ஒரு ஒத்திசைவான வரிசையில் பணிகளைக் கொண்டிருக்க முடியாது, ஏனெனில் ஒரு புதிய பணி வந்தவுடன், செயல்படுத்தும் நூல் ஏற்கனவே பணியைத் தேர்ந்தெடுத்துள்ளது .

ஒரு புதிய பணி வரிசையில் நுழையும் போது, ​​குளத்தில் இலவச செயலில் உள்ள நூல் இருந்தால், அது பணியை எடுக்கும். எல்லா இழைகளும் பிஸியாக இருந்தால், ஒரு புதிய நூல் உருவாக்கப்படும்.

தற்காலிக சேமிப்புக் குளம் பூஜ்ஜிய த்ரெட்களுடன் தொடங்குகிறது மற்றும் முழு எண்.MAX_VALUE த்ரெட்களாக வளரக்கூடும் . முக்கியமாக, தற்காலிக சேமிப்பு நூல் குளத்தின் அளவு கணினி ஆதாரங்களால் மட்டுமே வரையறுக்கப்படுகிறது.

கணினி வளங்களைப் பாதுகாக்க, தற்காலிக சேமிப்பு நூல் குளங்கள் ஒரு நிமிடம் செயலற்றதாக இருக்கும் நூல்களை அகற்றும்.

இது நடைமுறையில் எவ்வாறு செயல்படுகிறது என்பதைப் பார்ப்போம். பயனர் கோரிக்கையை மாதிரியாகக் கொண்ட பணி வகுப்பை உருவாக்குவோம்:


public class Task implements Runnable {
   int taskNumber;

   public Task(int taskNumber) {
       this.taskNumber = taskNumber;
   }

   @Override
   public void run() {
       System.out.println("Processed user request #" + taskNumber + " on thread " + Thread.currentThread().getName());
   }
}
    

முக்கிய முறையில் , நாங்கள் புதிய CachedThreadPool ஐ உருவாக்கி , பின்னர் செயல்படுத்த 3 பணிகளைச் சேர்க்கிறோம். எங்கள் சேவையின் நிலையை இங்கே அச்சிடுகிறோம் (1) .

அடுத்து, 30 வினாடிகளுக்கு இடைநிறுத்தப்பட்டு, மற்றொரு பணியைத் தொடங்கி, நிலையை (2) காட்டுவோம் .

அதன் பிறகு, எங்கள் முக்கிய நூலை 70 வினாடிகளுக்கு இடைநிறுத்தி, நிலையை (3) அச்சிட்டு , மீண்டும் 3 பணிகளைச் சேர்த்து, மீண்டும் நிலையை அச்சிடுவோம் (4) .

பணியைச் சேர்த்த உடனேயே நிலையைக் காண்பிக்கும் இடங்களில், புதுப்பித்த வெளியீட்டிற்காக முதலில் 1-வினாடி தூக்கத்தைச் சேர்க்கிறோம்.


ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 3; i++) {
            executorService.submit(new Task(i));
        }
 
        TimeUnit.SECONDS.sleep(1);
            System.out.println(executorService);	//(1)
 
        TimeUnit.SECONDS.sleep(30);
 
        executorService.submit(new Task(3));
        TimeUnit.SECONDS.sleep(1);
            System.out.println(executorService);	//(2)
 
        TimeUnit.SECONDS.sleep(70);
 
            System.out.println(executorService);	//(3)
 
        for (int i = 4; i < 7; i++) {
            executorService.submit(new Task(i));
        }
 
        TimeUnit.SECONDS.sleep(1);
            System.out.println(executorService);	//(4)
        executorService.shutdown();

மற்றும் முடிவு இங்கே:

பூல்-1-த்ரெட்-1 தொடரிழையில் பயனர் கோரிக்கை #
0
செயலாக்கப்பட்டது
. .ThreadPoolExecutor@f6f4d33[இயங்கும், பூல் அளவு = 3, செயலில் உள்ள நூல்கள் = 0, வரிசைப்படுத்தப்பட்ட பணிகள் = 0, முடிக்கப்பட்ட பணிகள் = 3]
பூல்-1-த்ரெட்-2 இழையில் #3 செயலாக்கப்பட்ட பயனர் கோரிக்கை
(2) java.util.concurrent. ThreadPoolExecutor@f6f4d33[இயங்கும், பூல் அளவு = 3, செயலில் உள்ள இழைகள் = 0, வரிசைப்படுத்தப்பட்ட பணிகள் = 0, முடிக்கப்பட்ட பணிகள் = 4] (3)
java.util.concurrent.ThreadPoolExecutor@f6f4d33[இயங்கும், பூல் அளவு = 0 , வரிசைப்படுத்தப்பட்ட பணிகள் = 0, முடிக்கப்பட்ட பணிகள் = 4]
பூல்-1-த்ரெட்-4 இழையில் செயலாக்கப்பட்ட பயனர் கோரிக்கை #4
பூல்-1-த்ரெட்-5 தொடரில் செயலாக்கப்பட்ட பயனர் கோரிக்கை #5
பூல்-1-த்ரெட்-4 தொடரிழையில் #6 பயனர் கோரிக்கை செயலாக்கப்பட்டது
(4) java.util.concurrent.ThreadPoolExecutor@f6f4d33[இயங்கும், பூல் அளவு = 2, செயலில் உள்ள நூல்கள் = 0, வரிசைப்படுத்தப்பட்ட பணிகள் = 0, முடிக்கப்பட்ட பணிகள் = 7]

ஒவ்வொரு படிநிலையிலும் செல்லலாம்:

படி விளக்கம்
1 (3 முடிக்கப்பட்ட பணிகளுக்குப் பிறகு) நாங்கள் 3 இழைகளை உருவாக்கினோம், மேலும் இந்த மூன்று இழைகளில் 3 பணிகள் செயல்படுத்தப்பட்டன.
நிலை காட்டப்படும் போது, ​​அனைத்து 3 பணிகளும் முடிந்து, மற்ற பணிகளைச் செய்ய நூல்கள் தயாராக உள்ளன.
2 (30-வினாடி இடைநிறுத்தம் மற்றும் மற்றொரு பணியைச் செய்த பிறகு) 30 விநாடிகள் செயலற்ற நிலைக்குப் பிறகு, நூல்கள் இன்னும் உயிருடன் உள்ளன மற்றும் பணிகளுக்காக காத்திருக்கின்றன.
மீதமுள்ள லைவ் த்ரெட்களின் குளத்திலிருந்து எடுக்கப்பட்ட நூலில் மற்றொரு பணி சேர்க்கப்பட்டு செயல்படுத்தப்படுகிறது.
குளத்தில் புதிய நூல் எதுவும் சேர்க்கப்படவில்லை.
3 (70-வினாடி இடைநிறுத்தத்திற்குப் பிறகு) குளத்தில் இருந்து நூல்கள் அகற்றப்பட்டுள்ளன.
பணிகளை ஏற்க எந்த இழைகளும் தயாராக இல்லை.
4 (மேலும் 3 பணிகளைச் செய்த பிறகு) கூடுதல் பணிகள் பெறப்பட்ட பிறகு, புதிய நூல்கள் உருவாக்கப்பட்டன. இந்த முறை இரண்டு நூல்கள் மட்டுமே 3 பணிகளைச் செயல்படுத்த முடிந்தது.

சரி, இப்போது நீங்கள் மற்றொரு வகை எக்ஸிகியூட்டர் சேவையின் தர்க்கத்தை அறிந்திருக்கிறீர்கள்.

எக்ஸிகியூட்டர்ஸ் பயன்பாட்டு வகுப்பின் மற்ற முறைகளுடன் ஒப்பிடுவதன் மூலம் , புதிய கேச்ட் த்ரெட்பூல் முறையானது ஒரு ஓவர்லோடட் பதிப்பைக் கொண்டுள்ளது, இது ஒரு த்ரெட்ஃபேக்டரி பொருளை ஒரு வாதமாக எடுத்துக்கொள்கிறது.