آموزش جدید Java
برای ثبت نام در دوره آموزش Java می توانید از لنک موجود استفاده نمایید .
مقدمه ای بر زبان و بستر اجرای Java
پروژه ی زبان برنامه نویسی جاوا را توسعه دهنده ی مشهور James Gosling در شرکت Sun Microsystem برای اولین بار کلید زده و در سال 1995 آن را به عنوان مولفه ی اصلی بستر اجرای جاوا (Java 1.0 [J2SE]) از شرکت Sun Microsystems منتشر کرد (Java 1.0 [J2SE]).
آخرین ویرایش رسمی و پایدار جاوا، بستر اجرای جاوا ورژن 8 یا 8 Java Standard Edition می باشد. با پیشرفت زبان Java و محبوبیتی که بدست آورد، تنظیمات مختلفی صورت گرفت تا جاوا با انواع پلت فرم ها سازگاری داشته و برنامه های نوشته شده با آن در تمامی محیط ها قابل اجرا باشد. برای مثال می توان به J2EE برای پیاده سازی اپلیکیشن های تجاری و بزرگ، J2ME برای توسعه ی اپلیکیشن های کوچک و تحت موبایل اشاره کرد.
ورژن های جدید J2 هر یک به ترتیب تحت عنوان Java SE"، Java EE و Java ME نام گذاری شدند. آنچه باعث محبوبیت بالای Java شده، شعار "کد را یکبار بنویس و آن را در همه بسترها اجرا کن" می باشد.
از ویژگی ها و امکانات زبان جاوا می توان به موارد زیر اشاره کرد:
- شی گرا یا Object Oriented – در آموزش Java همه چیز یک آبجکت است و از آنجایی که این زبان مبتنی بر مدل شی گرا/Object model می باشد، به راحتی می توان آن را گسترش داد.
- مستقل از بستر اجرای خاص و قابل اجرا بر روی محیط های مختلف/platform independent – برخلاف بیشتر زبان های برنامه نویسی مانند C و C++، زبان جاوا پس از کامپایل، مستقیما به زبان قابل فهم برای ماشین تبدیل نمی شود بلکه کامپایلر دستورات جاوا را به یک زبان میانی مستقل از پلت فرم به نام byte code ترجمه می کند. این زبان میانی را سپس برنامه ای به نام دستگاه مجازی جاوا یا JVM که نسخه های مختلف آن برای پلت فرم های متفاوت طراحی و پیاده سازی شده، به زبان قابل فهم برای ماشین تفسیر می کند.
- سادگی – Java طوری طراحی شده که یادگیری آن سهل باشد. پس از درک مفاهیم پایه ای شی گرایی و OOP، یادگیری باقی زبان بسیار آسان خواهد بود.
- امن (Secure) – Java به توسعه دهنده این امکان را می دهد که یک برنامه ی کارا، عاری از ویروس، قابل اطمینان و امن برای تمامی سیستم ها پیاده سازی کند. برنامه های مبتنی بر آموزش Java برای سنج هویت و authentication از روش رمزنگاری کلید عمومی (public-key encryption) بهره می گیرند.
- قابلیت اجرا بر روی پردازنده و محیط های مختلف به صورت یکسان/ Architecture-neutral- کامپایلر جاوا یک فایل حاوی آبجکت با فرمت خاص و architecture-neutral تولید می کند که برای کد کامپایل شده قابلیت اجرا بر روی پردازنده ی های مختلف و محیط های اجرایی مطرح را فراهم می آورد. این امکان با حضور سیستم زمان اجرای جاوا یا java runtime system در اختیار توسعه دهندگان برنامه ی جاوا قرار می گیرد.
- Portable و قابلیت اجرا بر روی هر سخت افزاری که JVM سازگار و مربوطه را دارد – خروجی کامپایلر جاوا یک کد غیر قابل اجرا به نام Bytecode است. در صورت وجود JVM یا دستگاه مجازی جاوا سازگار با سخت افزار میزبان، Bytecode را سیستم زمان اجرای جاوا یا Java run-time system که خود توسط jvm فراخوانی می شود، اجرا می نماید. کامپایلر مورد استفاده ی Java با ANSI C نوشته شده و یک زیرمجموعه از POSIX می باشد.
- Robust – Java سعی می کند با تاکید بر روی بررسی خطاها در زمان کامپایل و اجرا، شرایطی که ممکن است در آن خطاهای زیادی رخ دهد را از میان بردارد.
- قابلیت پردازش موازی و انجام چند کار به صورت همزمان (multi-threaded) – با قابلیت پردازش موازی زبان جاوا، این امکان برای توسعه دهنده فراهم شده که برنامه هایی پیاده سازی کند که چندین کار و عملیات را همزمان انجام دهد. این ویژگی زبان Java به توسعه دهنده امکان می دهد تا اپلیکیشن های تعاملی با قابلیت اجرا و پاسخ گویی سریع بنویسد.
- مفسری (Interpreted) – byte code که خروجی کامپایلر جاوا می باشد در حین اجرا به دستورات قابل فهم برای ماشین تبدیل می شود و این دستورات در حافظه ذخیره نمی شوند. فرایند توسعه بسیار سریع تر و تحلیلی خواهد بود چرا که پروسه ی linking (متصل کردن فایل ها فایل های اجرایی کوچک در قالب یک فایل اجرایی بزرگ واحد) افزایشی و سبک خواهد بود.
- کارایی بالا/high performance – به کمک کامپایلرهایی که کدها را در لحظه و به صورت داینامیک (Just-In-Time) ترجمه می کنند، سرعت اجرای برنامه افزایش می یابد.
- Distributed – قابلیت توسعه ی اپلیکیشن های تجاری، بزرگ و توزیع شده بر روی بستر وب و اینترنت را فراهم می آورد.
- Dynamic (داینامیک و دارای قابلیت تفسیر کد بر اساس دستگاه میزبان در زمان اجرا) – Java در اصل نسبت به C و C++ از ویژگی پویایی بیشتری برخودار است چرا که برای تطبیق با محیطی در حال تکامل تعبیه شده است. برنامه های مبتنی بر Java مقدار زیادی اطلاعات زمان اجرا (run-time) را با خود حمل می کنند که این اطلاعات می توانند جهت بررسی صحت و برطرف کردن دسترسی به آبجکت ها در زمان اجرا بکار روند.
پیشینه ای از جاوا
James Gosling پروژه ی زبان برنامه نویسی Java را در ژوئن سال 1991 جهت استفاده در یکی از چندین پروژه ی گیرنده ی دیجیتال تلویزیون (set-top box) خود کلید زد. زبان مورد نظر که در ابتدای امر "Oak"، اسم درختی که در بیرون دفتر مخترع زبان قرار داشت، نام گذاری شده بود و گاهی "Green" نیز نامیده می شد، در نهایت با استخراج کلمه ای تصادفی از یک لیست به Java تغییر نام یافت.
شرکت Sun اولین پیاده سازی و ویرایش عمومی از Java را تحت عنوان Java 1.0 در سال 1995 منتشر کرد. این زبان با شعار "کد را یکبار بنویس و آن را در تمامی محیط ها اجرا کن" یا WORA و ارائه ی runtime های رایگان برای بسترهای اجرا (platform) مطرح، محبوبیت بسیاری کسب کرد.
در تاریخ 13 نوامبر سال 2006، شرکت نام برده عمده ی قابلیت ها و ابزار Java را به صورت یک نرم افزار رایگان و متن باز (open source) تحت لیسانس GPL در اختیار عموم قرار داد.
در 8 مه سال 2007 میلادی، شرکت Sun پروسه را به اتمام رسانده و کل هسته (core) جاوا را به استثنای بخش کوچکی از کد که Sun مجوز نشر آن را نداشت، به صورت رایگان و متن باز (open-source) در اختیار توسعه دهندگان علاقه مند قرار داد.
آموزش چند رشته ای (Multi Threading) در Java
Multithreading (تقسیم برنامه به پردازش های موازی مجزا) در Java فرایندی است که طی آن چند thread به صورت مجزا اما همزمان اجرا می شوند.
یک thread در Java آن واحد می تواند در یکی از 5 وضعیت (state) مختلف قرار داشته باشد. با توجه به گفته های شرکت Sun، تنها 4 وضعیت مختلف برای چرخه ی حیات thread در جاوا وجود دارد که عبارتند از: new، runnable، non-runnable و terminated. در جاوا وضعیتی به نام running برای thread وجود ندارد.
کلاس Thread توابع سازنده (Constructor) و متدهایی را در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن ها می توان thread ایجاد کرده و عملیاتی را بر روی آن thread اجرا کرد. کلاس Thread از کلاس پایه ی Object ارث بری داشته و interface ای به نام Runnable را پیاده سازی می کند.
Thread scheduler در Java بخشی از JVM است که مدیریت زمان بندی و اجرای thread ها (بر اساس مقدار priority و اولویت) را برعهده دارد.
زمانی که متد sleep() از کلاس Thread فراخوانی می شود، thread مورد نظر به مدت زمان مشخصی اجرا را متوقف می نماید. در Java
در پاسخ باید گفت که نه. پس از اینکه یک thread راه اندازی شد، دیگر امکان راه اندازی مجددا آن وجود ندارد و در صورت اقدام به این کار، خطای IllegalThreadStateException رخ می دهد. در Java
آیا می توان در Java به طور مستقیم بجای start()، متد run() را صدا زد؟
متد join() منتظر می ماند تا thread جاری عملیات خود را تکمیل کند، سپس به thread بعدی اجازه ی اجرا می دهد. به عبارت دیگر، مقدار زمان مشخصی صبر می کند تا thread ای که بر روی آن فراخوانی شده کار خود را به پایان برساند و از حافظه حذف شود سپس به thread بعدی امکان اجرا می دهد.
کلاس Thread تعدادی در Java متد برای تغییر و بازیابی اسم آبجکت thread در اختیار توسعه دهنده قرار می دهد. به صورت پیش فرض، هر thread یک اسم اختصاصی مانند thread-0، thread-1 و غیره ... دارد. به منظور تنظیم اسم thread می توان از متد setName و جهت بازیابی اسم thread مورد نظر می توان از getName استفاده کرد.
تمامی thread ها در Java دارای یک اولویت اجرا و priority هستند. مقدار priority با یک عدد صحیح بین 1 تا 10 نمایش داده می شود (5 اولویت پیش فرض thread ها می باشد و مقدار 10 نشانگر بالاترین میزان اولویت اجرا می باشد). thread scheduler اغلب thread ها را بر اساس مقدار priority آن ها (که مبتنی بر الگوریتم preemptive هست) اجرا می نماید.
Daemon thread ها برای سرویس دهی به thread های تعریف شده توسط برنامه نویس که user thread نامیده می شود، بکار می روند. چرخه ی حیات و طول عمر این نوع thread ها وابسته به user thread ها بوده و با اتمام کار thread هایی که توسعه دهنده تعریف کرده، دستگاه مجازی Java daemon thread ها را نیز از حافظه پاک می کند.
Thread pool عبارت است مجموعه ای از worker thread ها که منتظر انجام عملیات بوده و بارها قابل استفاده می باشند. در واقع thread pool یک مخزن است از thread های آماده است که با استفاده از آن دیگر نیازی نیست هر بار خود توسعه دهنده یک thread جدید ایجاد کند بلکه از thread pool می خواهد که برای اجرای عملیات مورد نظر یک thread در اختیار او قرار دهد.
Java به توسعه دهنده این امکان را می دهد تا چندین thread را در یک آّبجکت واحد بگنجاند. از این طریق می توان به راحتی گروهی از thread ها را با فراخوانی تنها یک تابع معلق (suspend()) کرد، از سر گرفت (resume()) یا متوقف (interrupt()) نمود.
گاهی لازم می شود در صورت بسته شدن برنامه به طور ناگهانی (قبل از اینکه برنامه از حافظه پاک شود)، عملیات خاصی صورت گیرد. shutdown hook یک تکه کد است که به JVM معرفی و متصل شده و آن را مجبور می کند قبل از اینکه کاملا خاموش شود، عملیات معینی را اجرا کند.
در شرایطی که تنها یک عملیات (task) برای اجرا کردن وجود دارد، یک متد run() نیز برای انجام عملیات کفایت می کند. در زیر مثالی را مشاهده می کنید که در آن یک عملیات را چندین thread اجرا می کنند:
در زبان های C و C++ به ترتیب از توابع free() و delete() برای این منظور استفاده می شود. اما جاوا این کار را خود به صورت اتوماتیک انجام داده و به این دلیل در مدیریت حافظه بهتر عملی می کند.
تمامی اپلیکیشن های مبتنی بر Java یک نمونه از کلاس Java Runtime دارند که به آن ها امکان تعامل با محیط اجرای برنامه را می دهد.به بیان دیگر کلاس Java Runtime برای تعامل با java runtime environment بکار می رود. کلاس Java Runtime متدهایی برای اجرای یک process، فراخوانی GC، بازیابی و کل ظرفیت حافظه و آزاد سازی آن در اختیار توسعه دهنده قرار می دهد.