บทช่วยสอนJava

Java HOME Java Intro Java เริ่มต้น Java Syntax ความคิดเห็นของ Java ตัวแปร Java Java Data Types การหล่อแบบจาวา ตัวดำเนินการ Java Java Strings Java Math Java Booleans Java If...Else Java Switch Java ในขณะที่ลูป Java สำหรับลูป Java Break/ต่อ Java Arrays

เมธอดของจาวา

เมธอดของจาวา พารามิเตอร์เมธอด Java วิธี Java โอเวอร์โหลด ขอบเขต Java Java Recursion

คลาส Java

Java OOP Java Classes/Objects คุณสมบัติคลาส Java วิธีการคลาส Java Java Constructors Java Modifiers การห่อหุ้มด้วยจาวา แพ็คเกจ Java / API มรดกจาวา Java Polymorphism Java Inner Classes Java Abstraction อินเทอร์เฟซ Java Java Enums อินพุตผู้ใช้ Java Java วันที่ Java ArrayList Java LinkedList Java HashMap Java HashSet Java Iterator คลาส Java Wrapper ข้อยกเว้น Java Java RegEx Java Threads จาวา แลมบ์ดา

การจัดการไฟล์ Java

ไฟล์ Java Java สร้าง/เขียนไฟล์ Java อ่านไฟล์ Java ลบไฟล์

Java ฮาวทู

เพิ่มสองตัวเลข

Java Reference

คีย์เวิร์ด Java เมธอด Java String Java Math Methods

ตัวอย่าง Java

ตัวอย่าง Java Java Compiler แบบฝึกหัด Java Java Quiz ใบรับรอง Java


Java Threads


Java Threads

เธรดช่วยให้โปรแกรมทำงานได้อย่างมีประสิทธิภาพมากขึ้นโดยทำหลายๆ อย่างพร้อมกัน

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


การสร้างกระทู้

มีสองวิธีในการสร้างเธรด

สามารถสร้างได้โดยการขยายThreadคลาสและแทนที่run() วิธีการ:

ขยายไวยากรณ์

public class Main extends Thread {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

อีกวิธีหนึ่งในการสร้างเธรดคือการใช้Runnableอินเทอร์เฟซ:

ใช้ไวยากรณ์

public class Main implements Runnable {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

วิ่งกระทู้

หากคลาสขยายThreadคลาส เธรดสามารถรันได้โดยการสร้างอินสแตนซ์ของคลาสและเรียกใช้start()เมธอด:

ขยายตัวอย่าง

public class Main extends Thread {
  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

หากคลาสใช้Runnableอินเทอร์เฟซ สามารถเรียกใช้เธรดโดยส่งอินสแตนซ์ของคลาสไปยังตัวสร้างThreadของอ็อบเจ็กต์แล้วเรียกใช้ start()เมธอดของเธรด:

ใช้ตัวอย่าง

public class Main implements Runnable {
  public static void main(String[] args) {
    Main obj = new Main();
    Thread thread = new Thread(obj);
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

ความแตกต่างระหว่างเธรด "การขยาย" และ "การใช้งาน"

ความแตกต่างที่สำคัญคือเมื่อคลาสขยายคลาส Thread คุณจะไม่สามารถขยายคลาสอื่นได้ แต่ด้วยการใช้อินเทอร์เฟซ Runnable เป็นไปได้ที่จะขยายจากคลาสอื่นเช่นกัน เช่น: MyClass extends OtherClass implements Runnableclass


ปัญหาการทำงานพร้อมกัน

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

ตัวอย่าง

ตัวอย่างโค้ดที่ค่าของจำนวน ตัวแปร ไม่สามารถคาดเดาได้:

public class Main extends Thread {
  public static int amount = 0;

  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println(amount);
    amount++;
    System.out.println(amount);
  }

  public void run() {
    amount++;
  }
}

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

ตัวอย่าง

ใช้isAlive()เพื่อป้องกันปัญหาการทำงานพร้อมกัน:

public class Main extends Thread {
  public static int amount = 0;

  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    // Wait for the thread to finish
    while(thread.isAlive()) {
    System.out.println("Waiting...");
  }
  // Update amount and print its value
  System.out.println("Main: " + amount);
  amount++;
  System.out.println("Main: " + amount);
  }
  public void run() {
    amount++;
  }
}