السلام عليكم ورحمه الله وبركاته
اليوم سوف نتكلم عن استخدام الـ Thread , TimerTask , Runnable interface
ازاى دا يحصل
هيكون معانا مثال نستخدم فيه الحاجات دى
الموضوع اننا هنعمل نظام ساعه يتم تحديثها كل ثانيه
فذلك يتم عن طريق ثلاث طرق
وهيا استخدام الـ Thread
او استخدام الـ Runnable interface
او استخدام الـ TimerTask
هيا بنا نتكلم عن كل طريقه بالتفصيل ان شاء الله
لكن هناك جزء بسيط مشترك فى كل حاله
هى انشاء Frame يحتوى على JLable يتم تعديل الوقت عليه كل ثانيه
فقط هذا هو رسم الـ GUI
ناتى الى الجديد فى الموضوع
وهى كيفيه اجلاب الوقت وعرضه وتحديثه
يتم اجلاب الوقت من الـ Calendar Class
وسوف نوضح كيف يتم ذلك
لكن نوضح فقط كيف يتم تحديث الوقت كل مره
وهى انه يتم استخدام احد من الثلاثه اختيارات التى تم ذكرها من قبل
Thread , TimerTask , Runnable
دعنا نشرح كيفيه جلب الوقت
calendar = Calendar.getInstance();
نقوم بانشاء كائن من الكلاس Calendar
طب نجلب الساعات و الدقائق و الثوانى ازاى ؟
نستخدم الداله get(…)
من الكائن calendar
calendar.get(Calendar.HOUR) calendar.get(Calendar.MINUTE) calendar.get(Calendar.SECOND)
لمزيد من المعلومات عن الـ Calendar Class
http://download.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html
وبعد ذلك نقوم باعاده الكتابه على ال timeLable
لكن هذا يتم تكراره مره واحده
طب تقولى هاعمله فى loop ازاى بقا
هيتكرر ازاى و لا الloop دى هتكون تكرر كام مره ؟
طبعا هنحتاج الى اللجوء الى هدف الدرس
اولا طريقه الـ Thread
private void timeThread() {
new Thread() {
@Override
public void run() {
Calendar calendar;
while (true) {
try {
calendar = Calendar.getInstance();
calendar.setTime(new Date());
String time = ("Time (H:M:S) " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " ");
if (calendar.get(Calendar.AM_PM) == 1) {
time += "PM";
} else {
time += "AM";
}
timeLabel.setText(time);
sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}.start();
}وهى انشاء داله تحتوى على Thread
يحتوى على الاوامر الذى تستخدم فى اعاده ضبط الوقت
كيفيه عمل الخيط
هى عمل
new Thread(){
}.start();ولكن لابد من انشاء الداله المسئوله عن عمليه التشغيل
وهى الداله
run()
ويتم كتابه الكود المسئول عن التحديث بداخلها
كما هو موضح فى الكود مسبقا
وبعد ذلك استدعاء هذه الداله بعد ان يرسم الـ GUI
هكذا
public ClockWithThread() {
initComponents();
timeThread();
}لمزيد من التفاصيل عن الخيوط
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html
ثانيا طريقة الـ Runnable interface
نقوم باعمل implement
هكذا
public class ClockWithRunnable extends javax.swing.JFrame implements Runnable {
}للـ Runnable interface
وعندها يوجد هناك الداله الخاصه بالتشغيل
اللى هى داله
run ()
فلابد من وجودها
ونقوم ايضا بكتابه الكود الخاص بتحديث الوقت داخلها
public void run() {
while (true) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
String time = ("(H:M:S) " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " ");
if (calendar.get(Calendar.AM_PM) == 1) {
time += "PM";
} else {
time += "AM";
}
timeLabel.setText(time);
}
}وبعد ذلك نقوم باستدعاء عمل الداله run()
لكن لا يمكن استدعائها بالطريقه العاديه كانها داله عاديه
لابد من عمل thread
الذى ياخذ فى البناء الخاص به
Runnable
الذى يكون فى حالتنا هذه هو this
لانه هذه الكلاس تحتوى على
Runnable interface
هكذا
public ClockWithRunnable() {
initComponents();
new Thread(this).start();
}لمذيد من المعلومات حول
Runnable interface
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Runnable.html
الطريقه الثالثه والاخيره
وهى استخدام الـ Timer , TimerTask
نقوم بانشاء كائن من نوع TimerTask
الذى يستوجب ايضا انشاء داله run()
التى يكتب بداخلها نفس الكود الخاص بالتحديث
private void timerTaskThread() {
TimerTask timerTask = new TimerTask() {
public void run() {
while (true) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
String time = ("(H:M:S) " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " ");
if (calendar.get(Calendar.AM_PM) == 1) {
time += "PM";
} else {
time += "AM";
}
timeLabel.setText(time);
}
}
};
Timer timer = new Timer();
timer.schedule(timerTask, 0, 1000);
}وبعد ذلك نقوم بانشاء كائن من النوع Timer
وبعدها نستدعى الداله schedule(…)
على الكائن الذى من النوع Timer
وتاخذ القيم التاليه بالترتيب
timerTask الذى تم تعريفه من قبل
وتاخد مده التاخير فى عمل الكود بالملى ثانيه
وتاخذ اخر قيمه هي مده تكرار هذا الكود كل كام ملى ثانيه ؟؟
وبعد ذلك نستدعى الداله اللتى تحتوى على ال Timer , TimerTask
public ClockWithTimerTask() {
initComponents();
timerTaskThread();
}لمزيد من المعلومات عن الـ Timer , TimerTask
http://download.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html
http://download-llnw.oracle.com/javase/1.5.0/docs/api/javax/swing/Timer.html
الطرق الثلاثه متشابه تشابه كبير
هذا هو الكود الخاص بالثلاث طرق للتحميل
فى ملف واحد عباره عن three Frames
كل طريقه فى Frame منفصل
اتمنى ان يكون الشرح يكون مفهوم
سلام عليكم
