執行緒的基礎知識
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());
}
}
}