Java中,線程是程序并行執(zhí)行的最小單元。而Java程序的主線程是執(zhí)行main()方法的線程,通常也是整個Java程序的入口。在Java中,主線程可以派生出子線程,創(chuàng)建子線程的方式有兩種,一種是繼承Thread類,另一種是實現(xiàn)Runnable接口。
Java中的工作線程是一種輕量級線程,用于執(zhí)行一些輕量級的任務(wù)。當主線程需要執(zhí)行一些比較耗時的操作時,可以將這些操作放在工作線程中執(zhí)行,以避免阻塞主線程。一個典型的例子是進行網(wǎng)絡(luò)請求或者文件讀寫操作,這些操作需要花費大量的時間。如果在主線程中完成這些操作,則會導(dǎo)致UI界面卡頓甚至無響應(yīng)。這時,可以在工作線程中完成這些操作,主線程則可以繼續(xù)執(zhí)行其他操作。
public class MyRunnable implements Runnable { public void run() { // 這里進行耗時操作 } } public class MainThread { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); // 這里主線程可以繼續(xù)執(zhí)行其他操作 } }
然而,當主線程和工作線程需要同時訪問某些共享資源時,就會出現(xiàn)線程同步的問題。線程同步是指多個線程同時訪問某個共享資源時,需要有一種機制來保證任何時候只有一個線程可以訪問該資源。否則,就會有可能發(fā)生數(shù)據(jù)不一致等問題。
Java中通過鎖機制來實現(xiàn)線程同步。當一個線程需要訪問共享資源時,需要先獲得相應(yīng)的鎖,然后才能訪問該資源。而其他線程則需要等待該鎖被釋放后才能繼續(xù)訪問。
class MyRunnable implements Runnable { private int count = 0; private static Object lock = new Object(); public void run() { synchronized(lock) { for(int i = 0; i< 100; i++) { count++; } } } } public class MainThread { public static void main(String[] args) { MyRunnable runnable = new MyRunnable(); Thread t1 = new Thread(runnable); Thread t2 = new Thread(runnable); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("count:" + runnable.count); } }
上面的例子中,count是MyRunnable類的一個成員變量,用于記錄兩個線程同時對其進行加法操作的結(jié)果。由于這兩個線程訪問同一個變量,因此需要加鎖,保證操作的原子性和程序執(zhí)行的正確性。