Showing posts with label thread. Show all posts
Showing posts with label thread. Show all posts

Saturday, March 25, 2017

জাভা মেইন থ্রেড (Java Main Thread)

জাভা ভার্চুয়াল মেশিন যখন চলা শুরু করে, তখন এটি একটি থ্রেড তৈরি করে। একে মেইন থ্রেড বলা হয়। আমরা জাভাতে যে কোডগুলো করি সেগুলোকে মেইন থ্রেড রান করে। আমরা জানি যে প্রত্যেকটি জাভা প্রোগ্রামের একটি এন্ট্রি পয়েন্ট থাকে আর সেটি হলো মেইন মেথড (static void main(String[] args))। এই মেইন থ্রেড শুরুতেই এই মেইন মেথডটি খুঁজে। এই মেইন মেথড থেকেই প্রোগ্রাম চলা শুরু করে। উদাহরণ-


1
2
3
4
5
6
7
8
public class MainThreadDemo {

 public static void main(String[] args) {

  Thread thread = Thread.currentThread();
  System.out.println("Current Thread: " + thread.getName());
 }
}


এই প্রোগ্রামটি রান করলে আউটপুট আসবে- 

Current Thread: main

এথেকে বোঝা যাচ্ছে যে, জাভাতে আমরা যে কোডগুলো এক্সিকিউট করি সেগুলো কোনো না কোনো থ্রেড রান করে থাকে। 

Friday, March 24, 2017

মাল্টিথ্রেডেড ফাইল কপিয়ার (Multi-threaded file copier)

আগের দুটি আর্টিক্যালে কীভাবে জাভা দিয়ে ফাইল কপি করা যায় দেখানো হয়েছে ও কীভাবে থ্রেড ব্যবহার করতে হয় তার প্রাথমিক ধারণা দেওয়া হয়েছে। 

এই দুটি ধারণা থেকে আমরা একটি মাল্টি থ্রেডেড ফাইল কপিয়ার তৈরি করতে পারি। চলুন তাহলে লিখে ফেলা যাক- 


এক্ষেত্রে আমাদের প্রথমে একটি কপিয়ার লাগবে যা একই নির্দিষ্ট পাথ থেকে ফাইল  অন্য একটি পাথে কপি করতে পারে।


এরপর একটি থ্রেড ক্লাস তৈরি করি যা কিনা এই কপি অপারেশন সম্পন্ন করবে। 


এই ক্লাসটির রান মেথডে Copier এর একটি ইনস্ট্যান্স তৈরি করা হয়েছে। তারপর এর copy মেথডটিকে কল করা হয়েছে। আমাদের উদ্দ্যেশ্য হচ্ছে, একটি ফাইলের জন্য একটি থ্রেড ব্যবহার করবো। অর্থাৎ আমাদের ডিরেক্টরিতে যদি ৫ টি ফাইল থাকে তাহলে আমরা ৫টি থ্রেড তৈরি করবো এবং এগুলো আলাদা আলাদাভাবে পাশাপাশি কপি করতে থাকবে। 

আমাদের এই প্রোগ্রামটি হবে কমান্ডলাইন প্রোগ্রাম। অর্থাৎ আমরা কমান্ড লাইন থেকে ইনপুট নেবো। এক্ষেত্রে আমাদের দুটি ইনপুট নিতে হবে, একটি সোর্স ডিরেক্টরি, অন্যটি ডেস্টিনেশন, অর্থাৎ যে পাথে ফাইলগুলো রাখবো। 


এই CopyApp ক্লাসটির মেইন মেথডে প্রথমে এর ইনস্ট্যান্স তৈরি করা হয়েছে। তারপর মেইন মেথডের আর্গুমেন্ট অ্যারে থেকে সোর্স ও ডেস্টিনেশন টি আলাদা করে copyFiles এই মেথডে আর্গুমেন্ট হিেবে পাস করা হয়েছে। এই মেথডটিতে প্রথমে রিকার্সিভলি সবগুলো ফাইল একটি লিস্টে রাখা হয়েছে। এরপর একটি লুপের মধ্যে প্রত্যেকটি ফাইলের জন্য একটি করে থ্রেড তৈরি করে স্টার্ট করা হয়েছে। 

এরপর থ্রেডগুলোর রেফারেন্স একটি লিস্টে রাখা হয়েছে এবং একটি লুপরের মাধ্যমে এর join মেথডটি কল করা হয়েছে। 

প্রত্যেকটি জাভা প্রোগ্রাম শুরু হয় একটি মেইন থ্রেড থেকে। অর্থাৎ আমরা যদি জাভা প্রোগ্রামে কোনো থ্রেড তৈরি নাও করি, তাহলেও একটি মেইন থ্রেড আমাদের কোডগুলো এক্সিকিউট করে। তাহলে মেইন থ্রেড থেকে আমরা অনেকগুলো থ্রেড তৈরি করেছি এবং মেইন থ্রেড থেকে এগুলোকে রান করতে দিয়েছি। এই থ্রেডগুলো শেষ না হওয়া পর্যন্ত যাতে করে মেইন থ্রেড অপেক্ষা করে এজন্যে এই join মেথডটি কল করা হয়েছে। সবগুলো থ্রেডের কাজ শেষ হয়ে গেলে মেইন থ্রেডে একটি প্রিন্ট করা হয়েছে যে কপি সম্পন্ন হয়েছে।

এবার কমান্ডলাইনে এটিকে রান করতে হলে -




বিঃদ্রঃ এই আর্টিক্যালটি শুধুমাত্র তাদের জন্য যারা উপরে উল্লেখিত আর্টিক্যাল দুটি পড়েছে। এখানে যে কোড দেখানো হয়েছে এগুলো জাভা ৮ ব্যবহার করে আরও সংক্ষিপ্ত ও আর ভালোভাবে লেখা যায়। পরবর্তীতে তা দেখানো হবে।

Thursday, March 23, 2017

জাভা থ্রেড প্রোগ্রামিংঃ পর্ব- এক (Java threading: part -1 )

বর্তমানে সব ধরণের কম্পিউটারই একই সঙ্গে একাধিক কাজ করে থাকে অর্থাৎ অনেকগুলো প্রোগ্রাম রান করে। প্রত্যেকটি আলাদা আলাদা প্রোগ্রামের জন্য অপারেটিং সিস্টেম একটি করে প্রসেস রান করে। প্রসেসগুলো একে অপরের থেকে স্বাধীন এবং ভিন্ন হয়। এগুলোর নিজস্ব এক্সিকিউশন এনভাইরনমেন্ট ও মেমোরি স্পেস থাকে। প্রসেসগুলো একইসঙ্গে পাশাপাশি চলতে থাকে। উদাহরণসরূপ- আমরা একইসঙ্গে ইউটিউবে গান শুনতে পারি ও ওয়ার্ড প্রসেসরে ডকুমেন্ট টাইপ করতে পারি। 

তবে কখনো কখনো কোনো একটি প্রোগ্রামের বিভিন্ন অংশ পাশাপাশি চলার প্রয়োজন হতে পারে। সহজভাবে বোঝার জন্য ধরা ওয়ার্ডপ্রসেসরের দুটি ফাংশনালিটি কথা চিন্তা করা যাক- ইউজার যখন কিবোর্ড টাইপ করে সেগুলো ইনপুট হিসেবে নেওয়া ও বানান দেখা। এটি একটি নির্দিষ্ট প্রোগ্রামের দুটি অংশ। এগুলো পাশাপাশি চলে। অর্থাৎ আমরা যখন টাইপ করি, সঙ্গে সঙ্গে এগুলোর বানান ঠিক আছে কিনা তা দেখার প্রক্রিয়াটিও চলতে থাকে। একই প্রোগ্রামের একাধিক কাজ পাশাপাশি করার জন্য থ্রেড প্রয়োজন হয়। থ্রেডকে অনেকসময় লাইটওয়েট প্রসেসও বলা হয়। অর্থাৎ এগুলো একটি প্রসেসের মধ্যে ছোট ছোট প্রসেস যাদের নিজস্ব এক্সিকিউশন এনভাইরনমেন্ট থাকে। এক্সিকিউশন এনভাইরনমেন্ট অর্থ হলো যেখানে নির্দিষ্ট কোড এক্সিকিউট হয়। একটি প্রোগ্রামে অনেকগুলো থ্রেড কাজ করলে তাকে মাল্টিথ্রেডেড প্রোগ্রাম বলা হয়। 

আধুনিক প্রায় সব প্রোগ্রাম বা সফটওয়্যারগুলো মাল্টিথ্রেডেড। মাল্টিথ্রেডেড প্রোগ্রামিংকে কনকারেন্ট প্রোগ্রামিংও বলা হয়। কারণ এতে কোনো প্রোগ্রামের বিভিন্ন অংশ কনকারেন্টলি(concurrently) বা একইসঙ্গে চলে। জাভা প্রোগ্রামিং ল্যাংগুয়েজ ব্যবহার করে মাল্টিথ্রেডেড প্রোগ্রাম লেখা খুব সহজ। 

জাভাতে থ্রেড প্রোগ্রামিংয়ের ক্ষেত্রে Thread ক্লাসটি ব্যবহার করা হয়। জাভাতে দুইভাবে এই ক্লাসটি ব্যবহার করা যায়। 

১. Thread ক্লাসটিকে এক্সটেন্ড করে।
২. Runnable ইন্টারিফেস ব্যবহার করে। 

প্রথমে আমরা Thread ক্লাসটিকে এক্সটেন্ড করে একটি উদাহরণ দেখি-




উপরের প্রোগ্রামটিতে Thread ক্লাসটিকে ইনহেরিট করে একটি MyThread নামে একটি ক্লাস লেখা হয়েছে। Thread ক্লাসটি run() নামে একটি মেথড রয়েছে। এই মেথডটিতে ওভাররাইড করে এতে কিছু কোড লেখা হয়েছে। এই কোড অংশটুকু আমরা কনকারেন্টলি রান করতে চাই। এখানে একটি লুপ লেখা হয়েছে এবং এতে একটি প্রিন্ট মেথড রয়েছে। 

এরপর থ্রেড ক্লাসের একটি স্ট্যাটিক মেথড sleep() ব্যবহার করে কিছুক্ষণের জন্য প্রোগ্রামটিকে থামিয়ে দেওয়া হয়েছে। এই মেথড আর্গুমেন্ট হিসেবে একটি সংখ্যা নেয়। যে সংখ্যাটি দেওয়া হবে, ঠিক ততো মিলি সেকেন্ড এই থ্রেডটি বন্ধ হয়ে থাকেবে এবং আবার শুরু করবে। একটি সংখ্যা প্রিন্ট করতে মোটেও কোনো সময় লাগে না, এটি শুধুমাত্রে বোঝার সুবিধার্থে ব্যবহার করা হয়েছে যে, যাতে মনে হয় থ্রেডটি বেশ কিছুক্ষণ কাজ করছে। এই মেথডটি একটি চেকড এক্সেপশন থ্রো করে, এজন্য একে ট্রাই ক্যাচ ব্লকের মধ্যে রাখা হয়েছে। 

এবার এই ক্লাসটিকে একটি মেইন মেথড থেকে ব্যবহার করা যাক-





এখানে MyThread ক্লাসটির দুটি ইনস্ট্যান্স তৈরি করা হয়েছে। থ্রেড রান করা জন্য এর start() মেথডটি কল করতে হয়। 

এই প্রোগ্রামটি রান করলে যে আউটপুট আসবে তা হলো - 

0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9

এর অর্থ হলো দুটি লুপই পাশাপাশি রান করছে। 

এবার দ্বিতীয় উপায়টি অর্থাৎ Runnable ইন্টারফেইস ব্যবহার করে একটি উদাহরণ দেখা যাক- 






এখানে MyRunnable ক্লাসটি Runnable ইন্টারফেইসকে ইমপ্লিমেন্ট করেছে। এই ইন্টারফেইসটিতে একটি মাত্র মেথড run() রয়েছে। যে কোড অংশটুকু কনকারেন্টলি রান করার প্রয়োজন সেই কোড অংশটুকু এই মেথডে লিখতে হয়। এই ক্লাসটিকে ব্যবহার করতে হলে- 





এখানে প্রথমে একটি MyRunnable ক্লাসের ইনস্ট্যান্স তৈরি করা হয়েছে। এরপর Thread ক্লাসের কনস্ট্রাক্টরে এই ইনস্ট্যান্সটি আর্গুমেন্ট হিসেবে দিয়ে Thread ক্লাসের ইনস্ট্যান্স তৈরি করা হয়েছে। এরপর থ্রেডটিকে রান করার জন্য start() মেথডটি কল করা হয়েছে। 


এখানে একটি বিষয় মনে রাখতে হবে যে, যদিও যে কোড অংশটুকু কনকারেন্টলি রান করার প্রয়োজন তা রান মেথডের মধ্যে লিখতে হয়, কিন্তু থ্রেড রান করার জন্য এই মেথডটি ব্যবহার করা হয় না। এই মেথডটি থ্রেড নিজে ব্যবহার করে থেকে। থ্রেড রান করার জন্য start() মেথডটি কল করতে হয়। 


চলবে...