1. 程式人生 > >技術分享:程序和執行緒

技術分享:程序和執行緒

  程序和執行緒

  一、引入

  1.程序:每個獨立執行的程式

  4.多執行緒:在同一個程序(應用程式)中同時執行多個執行緒

  二、區別:

  2.執行緒:程式中維繫執行的分支

  舉例:人作業系統,吃程序,執行緒:睜眼、用手拿、張嘴吃

  3.多程序:在作業系統中同時執行多個程式

  執行緒的狀態

  一、執行緒狀態的分類

  NEW:建立一個執行緒,比如MyThread mt=new MyThread();

  RUNNABLE:可執行狀態,比如mt.start();

  WAITING/TIMED_WAITING:不可執行狀態,比如MyThread.sleep();

  BLOCKED:鎖定狀態,當前執行緒如果被解鎖,還可以再次執行

  TERMINATED:終止狀態,執行緒體執行結束

  

 

  二、設定執行緒的優先順序

  1.範圍:1-10

  java自帶優先順序引數

  MAX_PRIORITY:10

  MIN_PRIORITY:1

  NORM_PRIORITY:5

  2.方法

  setPriority(int p)/getPriority()

  執行緒的同步:

  一、引入

  當一個程序有多個執行緒時,每個執行緒都會搶佔資源,此時會引發一系列問題,引入同步的概念,可解決這些問題

  二、synchronized關鍵字

  使用:

  1.鎖物件

  synchronized(obj){...}或 synchronized(this){...}

  2.鎖方法:

  修飾符 synchronized 返回值型別 方法名(){....}

  死鎖

  一、引入

  執行緒1鎖住資源A 等待資源B,執行緒2 鎖住資源B等待資源A,兩個執行緒都在等待自己需要的資源,而這些資源被

  另外的執行緒鎖住,這些執行緒你等我我等你,誰也不願意讓出資源,這樣死鎖就產生了

  解決:在定義鎖時,也就是使用synchronized時,需要考慮當前資源被鎖後,其他資源是否也同時被鎖

  生產者與消費者:

  一、引入:

  生產者將產品交給店員,而消費者從店員處取走產品,店員一次只能持有固定數量的產品,

  如果生產者生產了過多的產品,店員叫生產者等一下,

  如果店中有空位放產品了再通知生產者繼續生產;

  如果店中沒有產品了,店員會告訴消費者等一下,

  如果店中有產品了再通知消費者來取走產品。

  容器類的執行緒安全:

  方法:

  List list =Collections.synchronizedList(new ArrayList());

  執行緒的建立和啟動

  一、建立和啟動的方式

  方式1:繼承Thread類

  步驟:①建立一個類,繼承Thread

  ②重寫run方法,該手動匯入

  ③使用Thread類物件呼叫start()方法啟動

  方式2:實現Runnable介面

  步驟:①建立一個類,實現Runnable介面

  ②重寫run()方法,自動提示

  ③建立一個Runnable子類物件,使用Thread構造器將該物件放入,初始化該Thread物件,呼叫start()方法

  二、兩種方式的比較:

  三、注意:

  1.Thread類在lang包下

  2.程式啟動後會建立兩個執行緒,一個是垃圾回收器執行緒,一個是主執行緒,main()方法執行在主執行緒中

  3.關於run()方法

  ①它是執行緒體,啟動一個執行緒,會執行該方法內的程式碼

  ②啟動執行緒時使用start()方法,此執行緒進入RUNNABLE狀態

  ③在啟動執行緒時不用呼叫run()方法,因為run()方法沒有實現多執行緒機制

  Thread類方法:

  執行緒的排程:

  一、排程方法:

  1.執行緒睡眠:Thread.sleep(long millis) throws interruptedException 方法

  使執行緒轉到阻塞狀態

  millis引數設定睡眠的時間,以毫秒為單位

  當睡眠結束後,就轉為就緒(Runnable)狀態

  2.執行緒讓步:

  Thread.yield()方法

  暫停當前正在執行的執行緒物件,把執行機會讓給相同或者更高優先順序的執行緒

  3.執行緒加入:

  join()throws InterruptedException 方法

  在當前執行緒中呼叫另一個執行緒的join()方法,則當前執行緒轉入WAITING狀態,

  直到另一個執行緒執行結束,當前執行緒再由阻塞轉為就緒狀態

  二、結束執行緒

  1.使用標誌位,較為常用

  2.對於sleep或wait中的執行緒,使用interrupt()來終止執行緒