一 簡介
線程這個話題,無論是在面試中仍是在工做中會常常的碰見。而併發編程的目的就是爲了在儘可能不影響程序的執行效率的狀況下保證數據的安全性和正確性。要想理解線程首先要明白一些概念性的東西。面試
進程:具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.編程
線程:進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源.安全
一個線程能夠建立和撤銷另外一個線程;同一個進程中的多個線程之間能夠併發執行.相對進程而言,線程是一個更加接近於執行體的概念,它能夠與同進程中的其餘線程共享數據,但擁有本身的棧空間,擁有獨立的執行序列。併發
二 線程的狀態
線程的生命週期中存在的狀態有新建、就緒、運行、阻塞、死亡。Java將操做系統中的運行和就緒兩個狀態合併稱爲運行狀態。Java線程在運行的生命週期中可能處於下表所示的6種不一樣的狀態,在給定的一個時刻,線程只能處於其中的一個狀態。ide
在Java中線程的變化以及Java對應的方法以下圖spa
在上圖中線程的狀態的變化以及操做線程的方法所有列出來了,有的是Object的方法有的是Thread的方法,有的是concurrent包下的一些方法。操作系統
三 線程的新建
線程的建立有的方式有三種分別是線程
1.經過繼承Thread重寫run方法code
2.經過實現Runnable接口重寫run方法blog
3.經過實現Callable<T>接口重寫call方法
具體代碼以下
public class ThreadTest { static class Thread1 extends Thread{ @Override public void run() { super.run(); } } static class Thread2 implements Runnable{ @Override public void run() { } } static class Thread3 implements Callable<Integer>{ @Override public Integer call() throws Exception { return null; } } public static void main(String[] args) throws Exception { Thread1 thread1 = new Thread1(); thread1.start(); thread1.run(); Thread2 thread2 = new Thread2(); thread2.run(); Thread3 thread3 = new Thread3(); Integer call = thread3.call(); } }