線程通信/String相關
線程通信
wait() : 一旦執(zhí)行此方法,當前線程就進入阻塞狀態(tài),并釋放同步監(jiān)視器。
notify() : 一旦執(zhí)行此方法,就會喚醒被wait的一個線程。如果有多個線程被wait,就喚醒優(yōu)先級高的那個。
notifyAll() : 一旦執(zhí)行此方法,就會喚醒所有被wait的線程
說明:
wait()、notify()、notifyAll()三個方法必須使用在同步代碼塊或同步方法中。
三個方法的調用者中必須是同步代碼塊或同步方法的同步監(jiān)視器
否則,會出現IllegalMonitorStatteException 異常
面試題:
sleep() 和 wait() 的異同?
相同點:一旦執(zhí)行方法,都可以使得當前線程進入阻塞狀態(tài)。
不同點:1.兩個方法聲明的位置不同:Thread類中聲明sleep(),Object類中聲明wait()
2.調用的要求不同:sleep()可以在任何需要的場景下調用。wait()必須使用在同步代碼塊中。
3.關于是否釋放同步監(jiān)視器:如果兩個方法都使用在同步代碼塊或同步方法中,sleep()不釋放同步監(jiān)視器。
方式三:實現Callable接口
與實現Runnable相比:
相比run() 方法,可以有返回值
方法可以拋出異常
支持泛型的返回值
需要借助Future Task 類,比如獲取返回結果
方式四:使用線程池
提供指定線程數量的線程池
執(zhí)行指定的線程的操作,需要提供實現Runnable 接口或Callable接口實現類的對象
關閉連接池
好處:1.提高響應速度(減少了創(chuàng)建新線程的時間)
2.降低資源消耗:重復利用線程池中線程,不需要每次都創(chuàng)建
3.便于線程管理
corePoolSzie() : 核心池的大小
maximunPoolSize:最大線程數
keepAliveTime:線程沒有創(chuàng)建任何時最多保持多長時間后會終止
常用類
String
聲明為final的,不可被繼承
String 實現了Serializable接口 : 表示字符串是支持序列化的
實現了Comparable接口:
內部定義了 final char[] value 用于存儲字符串數據,代表不可變的字符序列:不可變性;
通過字面量的方式給一個字符串賦值,此時的字符串值聲明在字符串常量池中,字符串常量池不會儲存相同內容的字符串。
通過自變量的方式進行賦值,存儲的是相同的地址。不管是字面量賦值的,還是new賦值的,其最終指向的都是方法區(qū)中的字符串常量池,但new的方式,其對象存的是堆空間中的地址,字面量的方式,直接指向了字符串常量池
面試題:String s = new String("abc"); 方式創(chuàng)建對象,創(chuàng)建了幾個對象?
兩個,堆空間一個,方法區(qū)一個。
常量與常量的拼接結果是在常量池的。且常量池中不會存在相同內容的常量。
只有其中有一個是變量,結果就在堆中(相當于new了對象)。
如果拼接的結果調用了inturn()方法,返回值就在常量池中。
常用方法
compareTo(); //先的減后的 負數:當前對象小
contains() ; ?// 包含子串
StringBuffer 和 StringBuilder
三者的異同:
String:不可變的字符序列,底層使用char[];
StringBuffer:可變的字符序列; 線程安全的,效率低。底層使用char[];
StringBuilder:可變的字符序列;線程不安全,效率高;底層使用char[];
append() ; 有返回值。可鏈式調用