java自學之路-----線程(3) String

線程{

同步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的監視器的方法是不是可以在任意位置喚醒線程,不一定要在同步代碼中?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章