1.Thread.sleep()
คุณสามารถแทรกการหยุดชั่วคราวในการทำงานของโปรแกรม Java โดยปกติแล้วสิ่งนี้ไม่จำเป็น เนื่องจากผู้ใช้ต้องการให้โปรแกรมทำงานโดยเร็วที่สุด มีคนไม่กี่คนที่ยินดีหากคุณจงใจทำให้โค้ดของคุณช้าลง
แต่ในฐานะโปรแกรมเมอร์ อาจมีสถานการณ์มากมายที่การหยุดโค้ดชั่วคราวจะเป็นประโยชน์ ตัวอย่างเช่น สมมติว่าคุณกำลังเขียนเกมและต้องการให้เกมทำอะไรสักอย่างทุกๆ สองวินาทีหรือหลายๆ ครั้งต่อวินาที
โดยทั่วไป การหยุดชั่วคราวมีประโยชน์ ดังนั้น มาดูวิธีเพิ่มการหยุดชั่วคราวในโค้ดของคุณ จริงๆแล้วมันง่ายมาก:
Thread.sleep(duration);
duration
ระยะเวลาของการหยุดชั่วคราวอยู่ที่ไหน ในหน่วยมิลลิวินาที ( 1/1000
ของหนึ่งวินาที)
คำสั่งนี้จะหยุดโปรแกรมของคุณชั่วคราวเป็นduration
เวลามิลลิวินาที ตัวอย่าง:
|
หยุดโปรแกรมชั่วคราว 2 วินาที |
|
หยุดโปรแกรมชั่วคราวครึ่งวินาที |
|
หยุดโปรแกรมชั่วคราว 1 ชั่วโมง |
นี่คือวิธีที่สามารถนำไปใช้ได้จริง สมมติว่าเรากำลังเขียนโปรแกรมที่จะปล่อยยานอวกาศ นี่คือลักษณะของโค้ด:
|
ในแต่ละวินาที โปรแกรมจะแสดงตัวเลข: 10 แล้ว จากนั้น9 จากนั้น8 ฯลฯเมื่อนับถึง 0 โปรแกรมจะแสดง " Let's go! " |
2. คำนวณการหยุดชั่วคราวอย่างถูกต้อง
ระยะเวลาของการหยุดชั่วคราวนั้นง่ายต่อการคำนวณ หากคุณต้องการให้โปรแกรมทำสิ่งใดสิ่งหนึ่งต่อวินาที การหยุดชั่วคราวคือ 1,000 มิลลิวินาที ถ้า 2 ครั้งต่อวินาที ให้หยุดชั่วคราว 500ms (1000/2)
หากคุณต้องการทำบางสิ่ง 15 ครั้งต่อวินาที ให้หยุดชั่วคราวเป็นเวลา 66 มิลลิวินาที (1000/15) ทุกอย่างดูค่อนข้างตรงไปตรงมา:
The duration of one iteration of the loop = 1000 / number of times per second
แต่มีความแตกต่างที่สำคัญมากที่นี่ แม้ว่าข้อความจำนวนมากจะดำเนินการอย่างรวดเร็ว แต่ก็ไม่ได้เกิดขึ้นทันที
ดูนี่สิ. สมมติว่าคุณมีการดำเนินการที่ใช้เวลา 100 มิลลิวินาทีจึงจะเสร็จสมบูรณ์ คุณต้องการดำเนินการนี้ 5 ครั้งต่อวินาที คุณควรหยุดนานแค่ไหน? ไม่ใช่ 200ms แน่นอน
สำหรับการดำเนินการที่จะดำเนินการ 5 ครั้งต่อวินาที เราต้องการเวลาที่ต้องใช้ในการดำเนินการบวกกับระยะเวลาหยุดชั่วคราวเท่ากับ 200 มิลลิวินาที ถ้าเราทำเช่นนั้น มันจะวิ่งอย่างแม่นยำ 5 ครั้งต่อวินาที ในกรณีของเรา การดำเนินการต้องการเวลา 100 มิลลิวินาที ซึ่งหมายความว่ายังเหลืออีก 100 มิลลิวินาทีสำหรับการหยุดชั่วคราว
pause duration = duration of one iteration of the loop - time required to execute the action
นักพัฒนาเกมตระหนักดีถึงความจริงที่ว่าเวลาที่ต้องใช้ในการดำเนินการนั้นสูงกว่าศูนย์มาก และคนที่เล่นเกมก็เช่นกัน
หากเกมทำงานที่ 20 FPS นั่นหมายความว่าสามารถวาดได้เพียง 20 เฟรมบนหน้าจอในหนึ่งวินาที 1000/20
ให้ผลตอบแทน 50 มิลลิวินาที นี่คือเวลาที่ต้องใช้ในการวาดเฟรมขณะเล่นเกม
3. นาโนวินาที
คอมพิวเตอร์ทุกวันนี้เร็วกว่าเมื่อ Java ถูกสร้างขึ้นมาก นั่นหมายความว่าการหยุดชั่วคราว 1 มิลลิวินาทีอาจไม่เพียงพอ
สมมติว่าเรามีการดำเนินการสั้น ๆ ที่เราต้องการดำเนินการ 2,000 ครั้งต่อวินาที เราจะหยุดครึ่งมิลลิวินาทีได้อย่างไร
สำหรับวิธีนี้ มีอีกหนึ่งวิธีที่แตกต่างกันThread.sleep()
:
Thread.sleep(milliseconds, nanoseconds);
วิธีนี้ทำให้โปรแกรมเข้าสู่โหมดสลีปตามจำนวนมิลลิวินาทีและนาโนวินาทีที่ระบุ
นาโนวินาทีคือ 1 ในล้านของมิลลิวินาที นั่นหมายความว่าการหยุดชั่วคราวหนึ่งมิลลิวินาทีครึ่งจะมีลักษณะดังนี้:
Thread.sleep(1, 500_000);
และถ้าคุณต้องการหยุด1/10
ชั่วเสี้ยววินาที คุณต้องเขียนสิ่งนี้:
Thread.sleep(0, 100_000);
คุณอาจไม่ได้ใช้วิธีนี้ในโปรแกรมของคุณในขณะนี้ แต่รู้แล้วไม่ได้ใช้ก็ยังดีกว่าต้องใช้แต่ไม่รู้เรื่อง
4. TimeUnit
ชั้นเรียน
อย่างไรก็ตาม Java มีคลาสอื่นที่จะทำให้ชีวิตของคุณง่ายขึ้นหากคุณตัดสินใจที่จะทำให้แอปพลิเคชันของคุณช้าลง เรากำลังพูดถึงTimeUnit
คลาสในjava.util.concurrent
แพ็คเกจ
โปรดจำไว้ว่าเนื่องจากคลาสไม่ได้อยู่ในjava.lang
แพ็กเกจ คุณจึงต้องเพิ่มบรรทัดimport java.util.concurrent.TimeUnit;
หรือเขียนjava.util.concurrent.TimeUnit
โค้ดทุกครั้ง
คลาสนี้ทำสิ่งเดียวกันกับThread.sleep()
แต่สะดวกกว่า:
TimeUnit.HOURS.sleep(15)
รหัสนี้จะทำให้โปรแกรมของคุณเข้าสู่โหมดสลีปเป็นเวลา 15 ชั่วโมง มีหน่วยนาที วินาที วัน เช่นเดียวกับไมโครวินาที (1/1000,000) และนาโนวินาที (1/1000,000,000)
คลาสTimeUnit
มีคุณสมบัติดังต่อไปนี้:
- นาโนวินาที:
NANOSECONDS
- ไมโครวินาที:
MICROSECONDS
- มิลลิวินาที:
MILLISECONDS
- วินาที
SECONDS
- นาที:
MINUTES
- ชั่วโมง:
HOURS
- วัน:
DAYS
การทำงานกับคุณสมบัติเหล่านี้สะดวกมาก เนื่องจากไม่จำเป็นต้องคิดถึงการแปลงชั่วโมงเป็นมิลลิวินาที รหัสดังกล่าวน่าเขียนและอ่านมากขึ้น
GO TO FULL VERSION