Java: Thread.currentThread (). sleep (x) กับ Thread.sleep (x)


86

ฉันมีสิ่งนี้ในรหัสของฉัน

Thread.currentThread().sleep(x);

Eclipse บอกให้ฉันใช้แบบคงที่

Thread.sleep(x); 

แทนทำไม? อะไรคือความแตกต่างในการทำงานระหว่าง 2 วิธีนี้มีความแตกต่างกันบ้าง?


1
มี 'Save Action' ใน Eclipse ซึ่งจะแทนที่การเข้าถึงสมาชิกแบบคงที่โดยอัตโนมัติผ่านตัวแปรอินสแตนซ์ที่มีการเข้าถึงแบบคงที่ผ่านชื่อคลาส - เปิดใช้งาน Save Action นี้และ Save Actions อื่น ๆ ตามที่คุณเห็นด้วย (เช่นลบการร่ายที่ไม่จำเป็นออกโดยไม่จำเป็น 'this' ฯลฯ )
les2

คำตอบ:


136

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

รหัสทั้งสองบรรทัดของคุณทำสิ่งเดียวกัน แต่อย่างที่สองเป็นรูปแบบที่ดีกว่า


25
+1 เพื่อระบุว่าโปรแกรมเมอร์อาจต้องการทำให้เธรดเฉพาะผ่าน someThread.sleep () ซึ่งไม่ได้
Chii

32

ใน Java การนอนหลับเป็นวิธีการคงที่ ทั้งสองตัวอย่างของคุณทำสิ่งเดียวกันทุกประการ แต่เวอร์ชันก่อนหน้านั้นสับสนเพราะดูเหมือนว่ากำลังเรียกใช้เมธอดบนวัตถุเฉพาะ แต่ไม่ได้ทำเช่นนั้นเลย ในตัวอย่างของคุณมันไม่สำคัญมากนัก แต่จะอันตรายกว่าหากคุณมีสิ่งต่อไปนี้:

someOtherThread.sleep(x);

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


คุณหมายถึงทั้ง currentThread และ someOtherThread จะเข้าสู่โหมดสลีปในขณะที่เรียกใช้บรรทัดเดียว "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar

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

3

การเรียกใช้เมธอดทั้งสองเหมือนกันในลักษณะการทำงานเนื่องจากเรียกใช้เมธอดเดียวกัน แต่ใช้ชื่อคลาส ( เธรดในกรณีนี้) แทนที่จะเป็นอินสแตนซ์สำหรับการเข้าถึงฟิลด์และเมธอดแบบคงที่ทำให้คงที่นี้ชัดเจน นั่นคือสาเหตุที่ทำให้เกิดคำเตือนนี้

แต่เมื่อพิจารณาว่าฟิลด์และเมธอดแบบคงที่จะแสดงในลักษณะเฉพาะใน IDE ส่วนใหญ่ (ตัวอย่างเช่นในฟอนต์ตัวเอียงใน Eclipse และ IntelliJ IDEA) คำเตือนนี้ยังจำเป็นอยู่หรือไม่ อาจจะไม่จำเป็นเท่าในยุคแรก ๆ ของ Java ที่มีการใช้โปรแกรมแก้ไขทั่วไป


0

Thread.currentThread().sleep(x);หรือวิธีที่Eclipseบอกว่าThread.sleep(x);จำเป็นต้องมีบริบทคงที่หากจำเป็นดังนั้นเราจึงต้องหน่วงเวลาเล็กน้อยด้วยการนอนหลับนี้

กระบวนทัศน์แบบคงที่ที่กำหนดโดยวัตถุหนึ่งจะมีผลเฉพาะกับวงจรชีวิตการพิมพ์ฮีปของวัตถุนั้น ๆ เท่านั้นอีกครั้งเมื่อพิจารณาถึงวงจรชีวิตของวัตถุโดยรวมคงไม่น่ารำคาญหากจำเป็นก็สามารถใช้เพื่อลดการเขียนโค้ดได้ แต่ต้องทำอย่างระมัดระวังในรูปแบบคงที่ print ถูกอ้างถึงโดยClass(ตัวอย่างเช่น: - Class.forName(pkg.className)) ตามชื่อและไม่ใช่ตามชื่อใด ๆobjectซึ่งเป็นสำเนาพิมพ์ครั้งเดียวของ Class ในHEAPหน่วยความจำ

การใช้วัตถุอีกครั้งยังมีข้อดีข้อเสียโดย Weak, Phantom, การอ้างอิงที่แข็งแกร่ง .... ,

รหัสได้รับการแปลงโดยธรรมชาติ มันเป็นเพียงวิธีที่เราทำเพื่อให้มันใช้งานได้และใช้งานได้จริง


1
หากต้องการพูดถึงเธรด - มันจะเกิดแบบอะซิงโครนัสแม้ว่าเราอาจมีสิ่งที่ซิงโครนัสในเธรด โดยธรรมชาติแล้วทุกสิ่งเป็นแบบอะซิงโครนัสแม้ว่าเราจะพบสิ่งที่ซิงโครนัสในบางครั้ง ไม่มีสิ่งใดที่ซิงโครไนซ์แม้แต่เราจะล่วงล้ำควอนตัมหรือดาราศาสตร์
Dev Anand Sadasivam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.