線程{
同步LOCK的運用{
同步代碼塊裏對鎖的操作時隱式的
jdk1.5之後將同步和鎖封裝成對象了,將操作鎖的隱式方式定義到該對象中,將隱式動作變爲顯示動作
格式:Lock lock = new lock子類()
lock.lock();....有異常必須用try{}finally{}....;lock.unlock();
如果要使用監視方法,可以定義多個監視器與同一個鎖綁定,
Condition c = lock.newCondition();
定義了一個監視器和lock綁定,同理可定義多個監視器與鎖綁定。凍結與喚醒的方法變爲c.await()和c.signal(),
所以在同步代碼塊中可以指定執行哪個任務的線程被喚醒
}
wait和sleep{
1.wait可以指定凍結時間或不指定;sleep必須指定時間
2.在同步中,對cpu的執行權和鎖的處理不同。wait釋放了執行權,釋放了鎖;sleep釋放執行權,不釋放鎖
}
控制線程任務結束{
1.任務代碼完成即結束
2.如果有無限循環,可定義結束的標記
3.如果線程處於wait,sleep凍結狀態,可以使用interrupt()方法將線程以凍結狀態強制恢復到運行狀態,讓其具有cpu執行資格,但會產生一個InterruptedException,需要處理
}
兩個方法{
1.setDaemon(true)將某一線程定爲後臺,與前臺一起運行,所有前臺結束的時候後臺也結束
2.join()讓線程獲得執行權,等處理完該線程的任務,其他線程纔有執行資格
}
}
String{
重點:字符串對象一旦初始化,該字符串就不可以被改變,如果修改的話就會生成一個新的字符串對象傳給引用,且都存在字符串常量池
String s1 = “abc”;這是在常量池創建一個對象
String s2 = new String(“abc”):在堆內創建了兩對象
兩個練習{
通過使用API裏String的方法
1.
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count = 0;
String str = "abcdfaabcfabcabcabcabc";
String key = "abc";
count = getContainStringCount(str, key);
System.out.println("count = " + count);
}
/**
* 返回字符串key在str裏出現的次數
* @param str
* @param key
* @return
*/
public static int getContainStringCount(String str, String key) {
// TODO Auto-generated method stub
int count = 0;
int index = 0;
for(; index<str.length(); ){
index = str.indexOf(key, index);
if(index == -1)
break;
count++;
index += key.length();
}
return count;
}
}
2.
public class StringTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abcdefg";
String key = "jkl";
String constanString = null;
constanString = getConstanBigestString(str, key);
System.out.println("constanString = " + constanString);
}
/**
* 返回最大相同字串
* @param str
* @param key
* @return
*/
private static String getConstanBigestString(String str, String key) {
// TODO Auto-generated method stub
int sLen = key.length();
for(int index=sLen; index>0; index--)
for(int i=0; i<sLen-index+1; i++){
String constanString = key.substring(i, i+index);
if(str.contains(constanString)){
return constanString;
}
}
return null;
}
}
}
}
有個問題:Condition的監視器的方法是不是可以在任意位置喚醒線程,不一定要在同步代碼中?