1. 程式人生 > >執行緒的基礎知識

執行緒的基礎知識

1.synchro關鍵字的用法
2.同步和非同步的區別
3.啟動一個執行緒是run還是start
相當於玩遊戲機,只有一個遊戲機(cpu),可是有很多人要玩,於是,start是排隊!
等CPU選中你就是輪到你,你就run(),當CPU的執行的時間片執行完,這個執行緒就繼續排隊,等待下一次的run()。
5.執行緒的基本狀態和狀態之間的關係
第一是建立狀態。在生成執行緒物件,並沒有呼叫該物件的start方法,這是執行緒處於建立狀態。
  
第二是就緒狀態。當呼叫了執行緒物件的start方法之後,該執行緒就進入了就緒狀態,
但是此時執行緒排程程式還沒有把該執行緒設定為當前執行緒,此時處於就緒狀態。
線上程執行之後,從等待或者睡眠中回來之後,也會處於就緒狀態。
 
 第三是執行狀態。執行緒排程程式將處於就緒狀態的執行緒設定為當前執行緒,
此時執行緒就進入了執行狀態,開始執行run函式當中的程式碼。
  
第四是阻塞狀態。執行緒正在執行的時候,被暫停,
通常是為了等待某個時間的發生(比如說某項資源就緒)之後再繼續執行。
sleep,suspend,wait等方法都可以導致執行緒阻塞。
 
 第五是死亡狀態。如果一個執行緒的run方法執行結束或者呼叫stop方法後,
該執行緒就會死亡。對於已經死亡的執行緒,無法再使用start方法令其進入就緒。
6.lock和sync的區別
在開始之前先把程序與執行緒進行區分一下,一個程式最少需要一個程序,
而一個程序最少需要一個執行緒。關係是執行緒–>程序–>程式的大致組成結構。
所以執行緒是程式執行流的最小單位,
而程序是系統進行資源分配和排程的一個獨立單位。以下我們所有討論的都是建立線上程基礎之上。
7.執行緒和程序的區別
8.runnable和callable的區別
相同點:
兩者都是介面;(廢話)
兩者都可用來編寫多執行緒程式;
兩者都需要呼叫Thread.start()啟動執行緒;
不同點:
兩者最大的不同點是:實現Callable介面的任務執行緒能返回執行結果;而實現Runnable介面的任務執行緒不能返回結果;
Callable介面的call()方法允許丟擲異常;而Runnable介面的run()方法的異常只能在內部消化,不能繼續上拋

9.什麼是執行緒安全
存在競爭的執行緒不安全,不存在競爭的執行緒就是安全的
11.如何在兩個執行緒之間共享資料
如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件有那個共享資料,例如,買票系統就可以這麼做
12.如何避免死鎖
設定加鎖順序,時限
13.活鎖和死鎖的區別
就是指執行緒一直處於執行狀態,但卻是在做無用功,而這個執行緒本身要完成的任務卻一直無法進展。就想小貓追著自己的尾巴咬,雖然一直在咬

15.如何保證多個執行緒按順序執行
通過thread的join方法保證多執行緒的順序執行, wait是讓主執行緒等待
16.List,set,Map是否繼承自Collection介面
List<Map<String, Object>> acNoMapList=(List<Map<String, Object>>)
map.get(“List”);

List,Set,Map是否繼承自Collection介面?

答:List,Set是,Map不是。

如圖:

  Collection 

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不能提供直接繼承自Collection的類,Java JDK提供的類都是繼承自Collection的"子介面",如:List和Set。

注意:Map沒有繼承Collection介面,Map提供key到value的對映。一個Map中不能包含相同key,每個key只能對映一個value。Map介面提供3種集合的檢視,Map的內容可以被當做一組key集合,一組value集合,或者一組key-value對映。

詳細介紹:
List特點:元素有放入順序,元素可重複
Map特點:元素按鍵值對儲存,無放入順序
Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
List介面有三個實現類:LinkedList,ArrayList,Vector
LinkedList:底層基於連結串列實現,連結串列記憶體是散亂的,每一個元素儲存本身記憶體地址的同時還儲存下一個元素的地址。連結串列增刪快,查詢慢
ArrayList和Vector的區別:ArrayList是非執行緒安全的,效率高;Vector是基於執行緒安全的,效率低
Set介面有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
SortedSet介面有一個實現類:TreeSet(底層由平衡二叉樹實現)
Query介面有一個實現類:LinkList
Map介面有三個實現類:HashMap,HashTable,LinkeHashMap
HashMap非執行緒安全,高效,支援null;HashTable執行緒安全,低效,不支援null
SortedMap有一個實現類:TreeMap
其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,儲存的是鍵值對
set 一般無序不重複.map kv 結構 list 有序

就個人而言.list 用的比較多. 其次map 最後set 至於什麼情況下使用什麼集合.看情況了. 也不好說.也沒那麼絕對.
看了下面的這個就更容易明白了
寫一段程式碼,遍歷一個List中的元素
List、Map、Set三個介面,存取元素時,各有什麼特點?

import java.util.*;

public class Test

{

public static void main(String [] arge)

{

List list = new ArrayList();

list.add(0, “a”);

list.add(1, “b”);

list.add(2, “c”);

list.add(3, “d”);

while(Iterator it = list.iterator();it.hasNext())

{

Object element = it.next();

System.out.println (element);

}

}

}

List、Map、Set

List 通過下標來存取 和值來存取

Map 鍵值對應來存取

set 存取元素是無序的


package com.operation;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

import java.util.TreeSet;

public class User {

private Integer userId;

private String userName;

private String address;

public User(int userId, String userName, String address) {

this.userId = userId;

this.userName = userName;

this.address = address;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public Integer getUserId() {

return userId;

}

public void setUserId(Integer userId) {

this.userId = userId;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public static void main(String[] args) {

// Map<Integer, User> map = new TreeMap<Integer, User>();

// map.put(1, new User(1,“李偉”,“beijing”));

// map.put(2, new User(2,“王文軍”,“beijing”));

//

// map.put(4, new User(2,“abc”,“beijing”));

// map.put(5, new User(2,“abc”,“beijing”));

//

//

//

// Set keys = map.keySet();

//

//// Iterator it = keys.iterator();

//// while (it.hasNext()) {

//// Integer key = it.next();

//// User user = map.get(key);

//// System.out.println("key = " + key + “\t” + "value = " + user.getUserName());

//// }

//

// for (Integer key : keys) {

// User user1 = map.get(key);

// System.out.println("key = " + key + “\t” + "value = " + user1.getUserName());

// }

Set set = new HashSet();

set.add(“a”);

set.add(“b”);

set.add(“c”);

set.add(“d”);

set.add(“d”);

set.add(“d”);

set.add(“d”);

set.add(“uuu”);

set.add(“e”);

Iterator it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

}

}