ในการทำงาน ถ้าเรารู้สึกว่างานไหนอาจจะทำคนเดียวไม่เสร็จ เราก็จะแบ่งงานไปให้คนอื่นช่วยทำ และสามารถทำงานนั้น ๆ ในเวลาเดียวกันได้ใช่ไหมครับ การเขียนโปรแกรมก็เช่นกันเราเรียกสิ่งนี้ว่า concurrent programming
ในโลกความจริงเราก็อาจจะใช้หน่วยการทำงานในเวลานึงเป็น “คน” ใช่ไหมครับ ส่วนโลกของ Java จะมีหน่วยของการทำงานอยู่ 2 หน่วย คือ “process” และ “thread”
Process
แอปพลิเคชันที่รันบน Java Virtual Machine (JVM) ส่วนใหญ่แล้ว 1 application มักจะมี 1 process การทำงาน โดย process จะมี memory resource ที่ขอจาก Operating Systems (OS) มาใช้งาน
Thread
ตัว Thread มักจะถูกเรียกว่า lightweight process และตัว Thread เองจะอยู่ภายใน process อีกที ที่โดน process แบ่ง resource ออกมาเพื่อสร้าง Thread
ในทุก ๆ แอปพลิเคชันมักจะมีอย่างน้อย 1 thread ทำงานอยู่ ที่เรามักเรียกว่า main Thread
Thread in Java
ในการเขียนแบบ concurrent programming ตัว Thread เองมีความสำคัญมากในการแตกหน่วยย่อย ๆ ออกเพื่อให้สามารถทำได้เร็วขึ้น และรองรับการขยายตัวของระบบ ในภาษา Java ตัว class Thread
ที่อยู่ภายใต้ package java.lang.Thread
และตอนที่ทำงาน Thread จะ execute การทำงาน object ของ interface java.lang.Runnable
Runnable
Runnable เป็น interface ที่มี abstract method ชื่อว่า run()
หากต้องการสร้าง object หรือ class เพื่อไปรันใน Thread จะต้อง implement method ตัวนี้
ในการเขียนโปรแกรมที่จะไปรันบน thread ก็มีทางเขียนอยู่ 2 แบบคือ
1. สร้าง Runnable
object จากนั้นส่ง object ที่สร้างไปให้ Thread ผ่าน constructor ตามตัวอย่าง HelloRunnable
2. สร้างใช้งาน object ที่เป็น subclass ของ Thread ที่ตัว Thread เองมีการ implement Runnable ตามตัวอย่าง HelloThread
จากตัวอย่างที่เห็นทั้งคู่สามารถทำงานที่ Thread ได้ทั้งคู่ แต่การนำไปใช้งานจริง ๆ จะนิยม implement จาก Runnable มามากว่าตามตัวอย่าง HelloRunnable
เนี่องจากการเหมาะกับการนำไปใช้คู่กับ high-level thread management API เช่น Executor
ส่วนการเขียนแบบ HelloThread
เป็นการเขียนแบบพื้นฐานให้เข้าใจการทำงาน Thread
อย่างไรก็ตามการเขียน Thread ก็ยังมีข้อจำกัดเกียวกับ resource ที่ใช้ ขึ้นอยู่กับ CPU ของเครื่องที่รันแอปพลิเคชันนั้น ๆ ว่าสามารถสร้าง Thread ขึ้นมาสูงสุดได้กี่ตัว
เราสามารถทราบจำนวน Thread ที่สามารถสร้างได้ผ่านคำสั่ง
int numOfThreads = Runtime.getRuntime().availableProcessors();
References
https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html