1.Thread.sleep()

คุณสามารถแทรกการหยุดชั่วคราวในการทำงานของโปรแกรม Java โดยปกติแล้วสิ่งนี้ไม่จำเป็น เนื่องจากผู้ใช้ต้องการให้โปรแกรมทำงานโดยเร็วที่สุด มีคนไม่กี่คนที่ยินดีหากคุณจงใจทำให้โค้ดของคุณช้าลง

แต่ในฐานะโปรแกรมเมอร์ อาจมีสถานการณ์มากมายที่การหยุดโค้ดชั่วคราวจะเป็นประโยชน์ ตัวอย่างเช่น สมมติว่าคุณกำลังเขียนเกมและต้องการให้เกมทำอะไรสักอย่างทุกๆ สองวินาทีหรือหลายๆ ครั้งต่อวินาที

โดยทั่วไป การหยุดชั่วคราวมีประโยชน์ ดังนั้น มาดูวิธีเพิ่มการหยุดชั่วคราวในโค้ดของคุณ จริงๆแล้วมันง่ายมาก:

Thread.sleep(duration);

duration ระยะเวลาของการหยุดชั่วคราวอยู่ที่ไหน ในหน่วยมิลลิวินาที ( 1/1000ของหนึ่งวินาที)

คำสั่งนี้จะหยุดโปรแกรมของคุณชั่วคราวเป็นduration เวลามิลลิวินาที ตัวอย่าง:

Thread.sleep(2000);
หยุดโปรแกรมชั่วคราว 2 วินาที
Thread.sleep(500);
หยุดโปรแกรมชั่วคราวครึ่งวินาที
Thread.sleep(60 * 60 * 1000);
หยุดโปรแกรมชั่วคราว 1 ชั่วโมง

นี่คือวิธีที่สามารถนำไปใช้ได้จริง สมมติว่าเรากำลังเขียนโปรแกรมที่จะปล่อยยานอวกาศ นี่คือลักษณะของโค้ด:

for (int i = 10; i > 0; i--)
{
   System.out.println(i);
   Thread.sleep(1000);
}

System.out.println("Let's go!");
ในแต่ละวินาที โปรแกรมจะแสดงตัวเลข: 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

การทำงานกับคุณสมบัติเหล่านี้สะดวกมาก เนื่องจากไม่จำเป็นต้องคิดถึงการแปลงชั่วโมงเป็นมิลลิวินาที รหัสดังกล่าวน่าเขียนและอ่านมากขึ้น

สามารถอ่านรายละเอียดเพิ่มเติมได้ที่นี่