บทความนี้จะอธิบายเทคโนโลยีเธรดของ Java โดยละเอียดพร้อมตัวอย่าง ฉันเชื่อว่าจะเป็นประโยชน์สำหรับการทำความเข้าใจการเขียนโปรแกรม Java อย่างลึกซึ้ง รายละเอียดมีดังนี้:
หลายๆ คนมีความเข้าใจเกี่ยวกับ Threads เมื่อเรียนรู้เรื่อง Java และเมื่อเราเริ่มติดต่อกับการพัฒนา Android เราก็ค้นพบว่า Threads มีความสำคัญเพียงใด บทความนี้จะแบ่งปันประสบการณ์ในการใช้ Java Threads ให้กับคุณเพื่อเป็นข้อมูลอ้างอิง
ก่อนอื่นทุกคนต้องเข้าใจว่าเธรดและกระบวนการไม่เหมือนกัน กระบวนการคืออะไร? กระบวนการนี้เหมือนกับที่เราต้องดำเนินการไฟล์คลาส และเธรดคือสิ่งที่เรียกทรัพยากรของ CPU ให้ทำงานจริงๆ โดยทั่วไปไฟล์คลาสจะมีเพียงกระบวนการเดียว แต่สามารถมีได้หลายเธรด การดำเนินการของเธรดเป็นวิธีการดำเนินการแบบอะซิงโครนัส
1. วิธีเริ่มเธรดอื่นในฟังก์ชันหลัก:
รหัสตัวอย่างจะเป็นดังนี้:
Thread_one คลาสสาธารณะ { public static void main(String [] args){ Run run = new Run(); //run.run();//นี่คือการเรียกเมธอด ซึ่งแตกต่างจากเธรด Thread thread = new มาก Thread (run); thread.start();//เริ่มเธรดและเรียกใช้เมธอด run() ของเธรดสำหรับ(int i=1; i<=20; i++){ System.out.println("ค่าของ main เธรด i: --------"+i); } }}คลาส Run ใช้งาน Runnable{ @Override public void run() { for(int i=1; i<=20; i++){ System.out .println( "ค่าของเธรดย่อย i: "+i);
2. วิธีสลีปในเธรด
รหัสตัวอย่างจะเป็นดังนี้:
Thread_sleep คลาสสาธารณะ { /* * เธรดหยุดชั่วคราว*/ โมฆะสาธารณะหลัก (สตริง [] args){ Runone run = new Runone(); Thread thread = new Thread(run); ลอง { Thread.sleep (5000); thread.interrupt();//ขัดจังหวะการทำงานของ thread//thread.stop();//เมื่อเปรียบเทียบกับการขัดจังหวะเธรด การหยุดจะหยาบเกินไปและไม่แนะนำให้ใช้วิธีนี้ เธรดลูกจำเป็นต้องถูกบังคับให้ปิด } catch (InterruptedException e) { e.printStackTrace(); } }}class Runone ใช้งาน Runnable{ @Override public void run() { for(int i=1; i<10; i++ ){ ลอง { Thread.sleep(1000 ); System.out.println("-----"+new Date()+"-----"); เมื่อตรวจพบว่าเธรดย่อยถูกขัดจังหวะ ให้ปิดเธรดย่อยโดยตรง} } }}
หมายเหตุพิเศษที่นี่คือ thread.interrupt(); สามารถขัดจังหวะการทำงานของเธรดได้ แม้จะเบากว่าการหยุดเล็กน้อย แต่ก็ไม่ใช่วิธีที่ดีที่สุดในการปิดเธรด นี่คือวิธีสำหรับคุณ:
Thread_stop คลาสสาธารณะ { สาธารณะคงเป็นโมฆะ main (สตริง [] args) { Runthree run = new Runthree (); Thread th = new Thread (run); th.start (); InterruptedException e) { e.printStackTrace(); } run.setStop(); }}คลาส Runnable{ ตั้งค่าสถานะบูลีน; @Override public void run() { flag = true; { System.out.println("child thread----"+(i++)); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } สาธารณะเป็นโมฆะ setStop() ธง = เท็จ;
ฉันขอแนะนำสั้น ๆ ให้คุณทราบถึงการรวมและการแจกในกระทู้:
1. วิธีการรวมเธรด เรียกว่า join() วิธีการที่นี่
รหัสตัวอย่างจะเป็นดังนี้:
Thread_join คลาสสาธารณะ { /* * รวมเธรด*/ โมฆะสาธารณะหลัก (สตริง [] args){ Runtwo run = new Runtwo(); Thread thread = new Thread(run); ลอง { thread.join ();//ผสานเธรด ซึ่งเทียบเท่ากับการเรียกเมธอด} catch (InterruptedException e) { e.printStackTrace(); } for(int i=0; i<10; i++){ System.out.println("main เธรด: "+i); } }}คลาส Runtwo ใช้งาน Runnable{ @Override public void run() { for(int i=0; i<10; i++){ System.out.println("Child thread: --- -"+i); } } }
2. วิธีการยกเลิกเธรด วิธีการ Yield() ของ Thread จะถูกเรียกที่นี่ ดังที่แสดงด้านล่าง:
Thread_yield คลาสสาธารณะ { /** ยอมแพ้ CPU * @param args */ สาธารณะ static void main (String [] args) { Th th = new Th ("aaa"); for (int i = 0 ; i<=10; i++){ System.out.println("Main thread----"+i); } }}คลาส Th ขยายเธรด{ Th(){} Th(String s){super(s) ;} @Override public void run() { for(int i = 0; i<=10; i++){ if(i%3!=0){ System.out.println("child thread"+i); } else { System.out.println("Sub-thread i="+i+" thread Switches"); Yield();//วิธีนี้สามารถใช้ได้ก็ต่อเมื่อคุณสืบทอดจาก Thread} } }}
สุดท้ายนี้ ฉันอยากจะแบ่งปันกับคุณ เกี่ยวกับปัญหาของลำดับความสำคัญของเธรด รหัสมีดังนี้:
Thread_priority ระดับสาธารณะ { /* * ลำดับความสำคัญกำหนดลำดับความสำคัญของเธรด * ลำดับความสำคัญเริ่มต้นของเธรดคือ 5; ลำดับความสำคัญสูงสุดของเธรดคือ 10 และค่าต่ำสุดคือ 0 */ โมฆะคงที่สาธารณะ main (String [] args){ T1 t1 = ใหม่ T1(); T2 t2 = ใหม่ T2(); //t1.setPriority(Thread.NORM_PRIORITY+3); //ตั้งค่าลำดับความสำคัญของ t1 t2.start(); }} ขยายเธรด { @Override public void run() { for(int i = 0; i<50; i++){ System.out.println("Thread T1-----"+i); } }} คลาส T2 ขยาย เธรด { @Override public void run() { for(int i = 0; i<50; i++){ System.out.println("Thread T2"+i);
ฉันเชื่อว่าคุณเข้าใจกลไกเธรดใน JAVA โดยพื้นฐานแล้วผ่านโค้ดข้างต้น ฉันหวังว่าสิ่งที่บทความนี้อธิบายจะเป็นประโยชน์กับคุณในการศึกษาการเขียนโปรแกรม Java ในเชิงลึก