線程
在作業系統中,線程是比程序更小的能夠獨立運作的基本機關。同時,它也是CPU排程的基本機關。
線程本身基本上不擁有系統資源,隻是擁有一些在運作時需要用到的系統資源,例如程式計數器、寄存器和棧等。
一個程序中的所有線程可以共享程序中的所有資源。
多線程
多線程可以了解為同一個程式中能夠同時運作多個不同的線程來執行不同的任務,
這些線程可以同時利用CPU的多個核心運作。
多線程程式設計能夠最大限度的利用CPU資源,如果某一個線程的處理不需要占用CPU資源時,(例如IO線程),
可以使目前線程讓出CPU資源以使其他線程能夠擷取到CPU資源,進而能夠執行其他線程對應的任務,
達到最大化利用CPU資源的目的
線程的實作方式
在Java中,實作線程的方式分為三種:
1.繼承Thread類
2.實作Runnable接口
3.實作Callable接口
1.通過繼承Thread類
2.通過實作Runnable接口
3.通過實作Callable接口
代碼
package com.breeze.concurrent.chapters1;
import java.util.concurrent.*;
/**
* 1.線程
* 在作業系統中,線程是比程序更小的能夠獨立運作的基本機關。同時,它也是CPU排程的基本機關。
* 線程本身基本上不擁有系統資源,隻是擁有一些在運作時需要用到的系統資源,例如程式計數器、寄存器和棧等。
* 一個程序中的所有線程可以共享程序中的所有資源。
*
* 2.多線程
* 多線程可以了解為同一個程式中能夠同時運作多個不同的線程來執行不同的任務,
* 這些線程可以同時利用CPU的多個核心運作。
* 多線程程式設計能夠最大限度的利用CPU資源,如果某一個線程的處理不需要占用CPU資源時,(例如IO線程),
* 可以使目前線程讓出CPU資源以使其他線程能夠擷取到CPU資源,進而能夠執行其他線程對應的任務,
* 達到最大化利用CPU資源的目的
*
* 線程的實作方式
* 在Java中,實作線程的方式分為三種:
* 1.繼承Thread類
* 2.實作Runnable接口
* 3.實作Callable接口
*/
public class Therad {
public static void main(String[] args) {
System.out.println("這是主線程:" + Thread.currentThread());
//1.繼承Thread類
Thread thread1 = new ThreadTest();
thread1.start();
//2.實作Runnable接口
Thread thread2 = new Thread(new RunnableTest());
thread2.start();
//lambda寫法
Thread thread2_1 = new Thread(() -> {
System.out.println("這是通過實作Runnable接口實作的線程:" + Thread.currentThread());
});
thread2_1.start();
//3.實作Callable接口
Callable callable = new CallableTest("測試");
FutureTask<String> task = new FutureTask<String>(callable);
Thread thread3 = new Thread(task);
thread3.start();
}
/**
* @author breeze
* @description 繼承Thread類實作
*/
static class ThreadTest extends Thread{
@Override
public void run(){
System.out.println("這是通過繼承Thread類實作的線程:" + Thread.currentThread());
}
}
/**
* @author breeze
* @description 實作Runnable接口
*/
static class RunnableTest implements Runnable{
public void run(){
System.out.println("這是通過實作Runnable接口實作的線程:" + Thread.currentThread());
}
}
/**
* @author breeze
* @description 實作Callable接口
*/
static class CallableTest implements Callable<String>{
private String str;
public CallableTest(String str){
this.str = str;
}
@Override
public String call() throws Exception {
System.out.println("這是通過實作Callable接口實作的線程:" + Thread.currentThread());
return str;
}
}
}
代碼執行結果
這是主線程:Thread[main,5,main]
這是通過繼承Thread類實作的線程:Thread[Thread-0,5,main]
這是通過實作Runnable接口實作的線程:Thread[Thread-1,5,main]
這是通過實作Callable接口實作的線程:Thread[Thread-2,5,main]