ไปให้ตรงประเด็น
ในแวดวงไอที เมื่อใดก็ตามที่เราพูดถึงการทำงานพร้อมกัน เราจะต้องพูดถึงชุดของเธรดที่ทำงานพร้อมกันบนคอมพิวเตอร์ หากมีโปรเซสเซอร์หลายตัวหรือโปรเซสเซอร์แบบมัลติคอร์บนคอมพิวเตอร์เครื่องนี้ แสดงว่า "ทำงานพร้อมกัน" จริงๆ อย่างไรก็ตาม หากคอมพิวเตอร์มีเพียงโปรเซสเซอร์แบบซิงเกิลคอร์ ดังนั้น "การทำงานพร้อมกัน" ก็เป็นเพียงลักษณะที่ปรากฏ
ระบบปฏิบัติการสมัยใหม่ทั้งหมดรองรับการปฏิบัติงานไปพร้อมๆ กัน คุณสามารถฟังเพลงและอ่านข่าวออนไลน์ได้โดยไม่ต้องรออีเมลฉบับแรก เราสามารถพูดได้ว่าการทำงานพร้อมกันนี้คือการทำงานพร้อมกันระดับกระบวนการ ภายในกระบวนการ ฉันยังเห็นว่ามีงานหลายอย่างที่ทำพร้อมกัน เราเรียกงานที่ทำงานพร้อมกันในเธรดกระบวนการ
แนวคิดทั่วไปอีกประการหนึ่งที่เกี่ยวข้องกับการเห็นพ้องต้องกันคือความเท่าเทียม มีความแตกต่างและความเชื่อมโยงระหว่างการเห็นพ้องต้องกันและความเท่าเทียม โปรแกรมเมอร์บางคน (ผู้เขียนทับศัพท์ว่า "โปรแกรมเมอร์") เชื่อว่าการรันแอปพลิเคชันที่มีหลายเธรดบนโปรเซสเซอร์แบบคอร์เดียวนั้นเกิดขึ้นพร้อมกัน และคุณสามารถสังเกตการทำงานของโปรแกรมเมอร์ได้ นอกจากนี้ เมื่อโปรแกรมของคุณรันด้วยหลายเธรด เมื่อเธรดรัน บนโปรเซสเซอร์หลายตัวหรือโปรเซสเซอร์แบบมัลติคอร์ พวกมันจะขนานกัน นอกจากนี้ยังมีโปรแกรมเมอร์บางคนที่คิดว่าหากเธรดของแอปพลิเคชันไม่ได้ถูกดำเนินการในลำดับที่กำหนดไว้ล่วงหน้า มันก็จะเกิดขึ้นพร้อมกัน เพื่อลดความซับซ้อนในการแก้ปัญหา จึงมีการใช้เธรด และเธรดเหล่านี้จะถูกดำเนินการในลำดับที่แน่นอน นี่คือความเท่าเทียม
บทนี้จะใช้ตัวอย่างสิบสองตัวอย่างเพื่อสาธิตวิธีการใช้ Java7 API เพื่อดำเนินการเธรดพื้นฐานบางอย่าง คุณจะสามารถดูวิธีสร้างและดำเนินการเธรดในโปรแกรม Java วิธีควบคุมการดำเนินการของเธรด วิธีจัดการกลุ่มของเธรดเป็นหน่วย ฯลฯ ในโปรแกรม Java
ในส่วนนี้ เราจะเรียนรู้วิธีสร้างเธรดในโปรแกรม Java และวิธีการรัน ในโปรแกรม Java ทุกอย่างเป็น Object และ Thread ก็เช่นกัน มีสองวิธีในการสร้างเธรด:
1. สืบทอดคลาส Thread และแทนที่เมธอด run()
2. สร้างคลาสที่ใช้อินเทอร์เฟซ Runnable จากนั้นสร้างอ็อบเจ็กต์ของคลาส Thread จากนั้นส่งผ่านอินสแตนซ์ของคลาสที่ใช้อินเทอร์เฟซ Runnable เป็นพารามิเตอร์ไปยังอินสแตนซ์ของคลาส Thread
ในส่วนนี้ เราจะใช้วิธีที่สองเพื่อสร้างเธรดสิบเธรดและรันเธรดเหล่านั้น แต่ละเธรดจะคำนวณและพิมพ์ผลคูณของจำนวนเต็มสองตัวภายในสิบ
รู้ว่ามัน
ทำตามขั้นตอนที่อธิบายไว้ด้านล่างเพื่อใช้ตัวอย่างนี้:
1. สร้างคลาสชื่อ Calculator และใช้อินเทอร์เฟซ Runnable รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
เครื่องคิดเลขคลาสสาธารณะใช้ Runnable {
2. ประกาศแอตทริบิวต์จำนวนเต็มส่วนตัวชื่อ number และใช้ตัวสร้างของคลาสนี้เพื่อเริ่มต้นแอตทริบิวต์ที่เพิ่งประกาศ รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
หมายเลข int ส่วนตัว
เครื่องคิดเลขสาธารณะ (หมายเลข int) {
this.number = จำนวน;
-
3. นำเมธอด run() ไปใช้ ซึ่งเป็นโปรแกรม (คำสั่ง) ที่ทำงานเมื่อเธรดที่เราสร้างขึ้นถูกดำเนินการ ดังนั้นวิธีนี้จึงใช้ในการคำนวณตารางสูตรคูณ รหัสเฉพาะมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
@แทนที่
โมฆะสาธารณะวิ่ง () {
สำหรับ (int i = 0; i <10; i++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName()
หมายเลข, i, i * หมายเลข);
-
-
4. ตอนนี้ก็ถึงเวลาที่จะใช้คลาสหลักของแอปพลิเคชันตัวอย่าง สร้างคลาสชื่อ Main และเพิ่มเมธอดหลักในคลาส รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ชั้นเรียนสาธารณะหลัก {
โมฆะคงที่สาธารณะ main (String [] args) {
5. ภายในเมธอด main() ให้สร้าง for loop ที่วนซ้ำสิบครั้ง ในส่วนเนื้อหาของลูป ให้สร้าง object Calculator ของคลาส Calculator สร้าง object thread ของคลาส Thread และส่งเครื่องคิดเลขเป็นพารามิเตอร์ของ ตัวสร้างคำสั่งการเริ่มต้นของเธรด สุดท้ายให้เรียกใช้เมธอด start() ของวัตถุเธรด รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
สำหรับ (int i = 0; i <10; i++) {
เครื่องคิดเลขเครื่องคิดเลข = เครื่องคิดเลขใหม่ (i);
เธรดเธรด = เธรดใหม่ (เครื่องคิดเลข);
เธรด.เริ่มต้น();
-
6. รันโปรแกรมนี้เพื่อดูว่าเธรดต่างๆ ทำงานพร้อมกันอย่างไร
รู้ว่าทำไม
ต่อไปนี้เป็นส่วนของเอาต์พุตที่พิมพ์บนคอนโซลเมื่อรันโปรแกรม เราจะเห็นว่าเธรดทั้งหมดที่เราสร้างขึ้นกำลังดำเนินการพร้อมกัน
คัดลอกรหัสรหัสดังต่อไปนี้:
เธรด-3: 3 * 5 = 15
เธรด-0: 0 * 2 = 0
เธรด-3: 3 * 6 = 18
เธรด-1: 1 * 6 = 6
เธรด-1: 1 * 7 = 7
เธรด-3: 3 * 7 = 21
เธรด-3: 3 * 8 = 24
เธรด-0: 0 * 3 = 0
เธรด-0: 0 * 4 = 0
เธรด-3: 3 * 9 = 27
เธรด-1: 1 * 8 = 8
โปรแกรม Java ทั้งหมดดำเนินการอย่างน้อยหนึ่งเธรด เมื่อเรารันโปรแกรม Java Java Virtual Machine (ต่อไปนี้จะเรียกว่า JVM) จะรันเธรดและเรียกใช้โปรแกรมที่มีเมธอด main()
เมื่อเรียกใช้เมธอด start() ของวัตถุ Thread เธรดอื่นจะถูกสร้างขึ้น มีการเรียกใช้เมธอด start() กี่ครั้ง จำนวนเธรดที่ถูกสร้างขึ้น
เมื่อเธรดทั้งหมดดำเนินการเสร็จสิ้น โปรแกรม Java จะยุติการทำงาน (ยกเว้นในกรณีพิเศษ เธรดที่ไม่ใช่ daemon ทั้งหมดจะถูกดำเนินการ) เมื่อเธรดเริ่มต้น (เช่น เธรดที่เรียกใช้เมธอด main()) สิ้นสุดลง เธรดที่เหลือจะยังคงดำเนินการต่อไปจนกว่างานการคำนวณจะเสร็จสิ้น เมื่อเธรดใดเธรดหนึ่งเรียก System.exit() เพื่อขอให้ JVM ยุติโปรแกรม เธรดทั้งหมดจะยุติการดำเนินการ
เมื่อเรียกใช้เมธอด run() ของวัตถุ Thread เธรดจะไม่ถูกสร้างขึ้น ในทำนองเดียวกัน เมื่อเรียกใช้เมธอด run() ของคลาสที่ใช้อินเทอร์เฟซ Runnable เธรดจะไม่ถูกสร้างขึ้น เธรดจะถูกสร้างขึ้นเมื่อมีการเรียกเมธอด start() ของวัตถุ Thread เท่านั้น
ไม่มีวันสิ้นสุด
ดังที่กล่าวไว้ในตอนต้นของส่วนนี้ มีวิธีอื่นในการสร้างเธรด: สืบทอดคลาส Thread และแทนที่เมธอด run() ด้วยวิธีนี้ คุณสามารถสร้างอ็อบเจ็กต์ของคลาสย่อย Thread แล้วเรียก start() วิธีการสร้างเธรด
คัดลอกรหัสรหัสดังต่อไปนี้:
เนื่องจากผมกำลังเตรียมตัวสัมภาษณ์อยู่จึงพบข้อมูลมากมายเกี่ยวกับ Java multi-threading รวมถึง "Java 7 Concurrency Cookbook" เล่มนี้ คำอธิบายก็เรียบง่ายและเข้าใจง่าย เหมาะสำหรับเพื่อนๆ ที่ไม่รู้จัก มากเกี่ยวกับมัลติเธรดแต่ต้องการเรียนรู้อย่างจริงจัง หลังจากค้นหาแล้วไม่พบเวอร์ชันภาษาจีน ดังนั้นฉันจึงตัดสินใจทำอาหารและเสื้อผ้าให้เพียงพอด้วยตัวเอง ดังนั้นเราจึงวางแผนที่จะเผยแพร่การแปลอย่างไม่เป็นทางการ และชื่อเรื่องมีชื่อว่า "Java7 Concurrency Example Collection" อย่างไม่แน่นอน
ใช้หลักคำสอน
บทความนี้แปลมาจาก "Java 7 Concurrency Cookbook" (D Gua Ge ขโมยมาในชื่อ "Java7 Concurrency Example Collection") และใช้เป็นสื่อการเรียนรู้เท่านั้น ห้ามนำไปใช้เพื่อวัตถุประสงค์ทางการค้าใดๆ โดยไม่ได้รับอนุญาต
ความสำเร็จเล็กๆ น้อยๆ
หนังสือต้นฉบับไม่มีรหัสครบถ้วนซึ่งไม่สะดวกต่อการดู ดังนั้นพี่ดีกัวจึงเพิ่มส่วนเพื่อแสดงโค้ดเวอร์ชันเต็มที่แสดงในส่วนนี้
รหัสที่สมบูรณ์ของคลาสเครื่องคิดเลขมีดังนี้:
แพ็คเกจ com.diguage.books.concurrencycookbook.chapter1.recipe1;
-
* วันที่: 13-09-2013
* เวลา: 21:42 น
-
เครื่องคิดเลขคลาสสาธารณะใช้ Runnable {
หมายเลข int ส่วนตัว
เครื่องคิดเลขสาธารณะ (หมายเลข int) {
this.number = จำนวน;
-
@แทนที่
โมฆะสาธารณะวิ่ง () {
สำหรับ (int i = 0; i <10; i++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName()
หมายเลข, i, i * หมายเลข);
-
-
-
รหัสที่สมบูรณ์ของคลาสหลัก
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.diguage.books.concurrencycookbook.chapter1.recipe1;
-
* วันที่: 13-09-2013
* เวลา: 19:46 น
-
ชั้นเรียนสาธารณะหลัก {
โมฆะคงที่สาธารณะ main (String [] args) {
สำหรับ (int i = 0; i <10; i++) {
เครื่องคิดเลขเครื่องคิดเลข = เครื่องคิดเลขใหม่ (i);
เธรดเธรด = เธรดใหม่ (เครื่องคิดเลข);
เธรด.เริ่มต้น();
-
-
-