線程 線程和進程 進程 : 進程指正在運行的程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。 線程 : 線程是進程中的一個執行單元(執行路徑),負責當前進程中程式的執行,一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程式也 ...
線程
線程和進程
進程 : 進程指正在運行的程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。
線程 : 線程是進程中的一個執行單元(執行路徑),負責當前進程中程式的執行,一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程式也可以稱之為多線程程式。
線程是程式執行流的最小單
實現線程
繼承Thread類並且重寫run方法
啟動線程的時候需要使用的方法是start() 不能直接調用run()方法
主要方法
- start() 啟動線程
- Thread.currentThread() 獲取當前線程
- getName() 獲取線程名字
- Thread.sleep(long m) 讓當前線程停止m毫秒
示例
public class ThreadDemo extends Thread {
public static void main(String[] args) {
ThreadDemo demo = new ThreadDemo();
demo.start(); // 需要啟用start() 並不是直接調用run方法
for (int i = 0; i < 5000; i++) {
System.out.println("you are ok");
}
}
@Override
public void run() {
for (int i = 0; i < 5000; i++) {
System.out.println("張含笑最美");
}
}
}
實現Runnable介面,並且實現run()方法
Runnable介面中只設定了一個run()方法,所以要啟用線程需要new 一個Thread 然後再其構造方法內傳遞Runnable
因為單繼承多實現的原則,避免了單繼承的局限性,繼承介面的實現了線程對象和線程任務的分離,有利於解耦
示例
```
public class RunnableDemo implements Runnable {
public static void main(String[] args) {
RunnableDemo demo = new RunnableDemo();
Thread th = new Thread(demo);
th.start();
}
@Override
public void run() {
for (int i = 1; i < 2000; i++) {
System.out.println(1);
}
}
}
```
匿名內部類
示例
```
new Thread(){
public void run(){
System.out.println("run1");
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run2");
}
}).start();
```
線程池
開闢一塊記憶體空間,裡面存放了眾多(未死亡)的線程,池中線程執行調度由池管理器來處理。當有線程任務時,從池中取一個,執行完成後線程對象歸池,這樣可以避免反覆創建線程對象所帶來的性能開銷,節省了系統的資源。
線程池可以調用實現Callable介面的類,
Callable 和 Runnable
Runnable 和 Callable 都代表那些要在不同的線程中執行的任務
Runnable 從 JDK1.0 開始就有了,Callable 是在 JDK1.5 增加的。
它們的主要區別是 Callable 的 call() 方法可以返回值和拋出異常,而 Runnable 的 run() 方法沒有這些功能。
Callable 只可以通過線程池來調用,而不可以通過Thread類來調用
Java提供五種線程池 // 這五種線程池都可以通過Executors來調用方法創建
newFixedThreadPool 創建固定大小的線程池,每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小,線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。
newCachedThreadPool 創建一個可緩存線程池,如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閑的線程池不會使用任何資源。
newSingleThreadExecutor 創建是一個單線程池,也就是該線程池只有一個線程在工作,它相當於newFixedThreadPool方法是傳入的參數為1
newScheduledThreadPool 創建一個大小無限的線程池,此線程池支持定時以及周期性執行任務的需求。
newSingleThreadScheduledExecutor 創建一個單線程化的支持定時的線程池,可以用一個線程周期性執行任務(比如周期7天,一次任務才用1小時,使用多線程就會浪費資源)
示例
ExecutorService pool = Executors.newFixedThreadPool(2);
submit() 傳遞的為線程類
Future<String> future = pool.submit(new ThreadCallback(5));
Future<String> future2 = pool.submit(new ThreadCallback(50));
System.out.println(future.get());
System.out.println(future2.get());