進程和線程的區別與聯系:
1、進程是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。進程一般由程序,數據集合和進程控制塊三部分組成。進程具有的特征:動態性、并發性、獨立性、結構性。
2、線程是程序執行的最小單位。線程上下文切換比進程上下文切換要快得多。
3、進程使用獨立的數據空間,而線程共享進程的數據空間。一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線。
創建線程有幾種不同的方式:
繼承Thread類、實現Runnable接口、使用Callable和FutureTask、使用線程池(如用Executor框架)、Spring實現多線程(底層是線程池)、定時器Timer(底層封裝了一個TimerThread對象)。
實現Runnable接口這種方式更受歡迎,因為不需要繼承Thread類,已經繼承或者需要繼承別的接口的時候,只能實現接口,Java是不支持多繼承的。同時,線程池也是非常高效的,很容易實現和使用。
線程在執行過程中,可以處于下面幾種狀態:
就緒(Runnable):線程準備運行,不一定立馬就能開始執行。
運行中(Running):進程正在執行線程的代碼。
等待中(Waiting):線程處于阻塞的狀態,等待外部的處理結束。
睡眠中(Sleeping):線程被強制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成。
同步阻塞(Blocked on Synchronization):等待獲取鎖。
死亡(Dead):線程完成了執行。
start()方法和run()方法的區別:
當程序調用start()方法時,會創建一個新線程,然后執行run()方法。但是如果我們直接調用run()方法,則不會創建新的線程,run()方法將作為當前調用線程本身的常規方法調用執行,并且不會發生多線程。
一個線程代碼例子:
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo(String name) {
// 初始化操作
threadName = name;
System.out.println("初始化線程名稱: " + threadName);
}
public void run() {
// 運行時需要執行的操作
System.out.println("線程正在執行: " + threadName);
System.out.println("線程 " + threadName + " 執行結束.");
}
public void start() {
// 創建線程
System.out.println("開始創建線程: " + threadName);
if (t == null) {
t = new Thread(this, threadName);
t.start();
}
}
}
public class test {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo("Thread-1");
R1.start();
}
}