成員變量,類變量,局部變量,參數(shù)
- 成員變量和局部變量
成員變量在類中定義,存在于堆內(nèi)存中的,有默認的初始值。
例如:String null;
int 0;
boolean false;
局部變量定義在方法中,即 方法名(局部變量,也叫參數(shù)列表),存在于棧內(nèi)存中,沒有默認的初始值,必須初始化,不然無法訪問,方法出棧,局部變量隨之消失
- 成員變量分為實例變量和類變量
實例變量:取決于類的實例,每創(chuàng)建一個實例,Java會為該類的實例變量分配一次內(nèi)存,而實例變量則屬對象私有,某一個對象將其值改變,不影響其他對象
類變量(static所修飾的成員變量):
類的靜態(tài)成員變量在內(nèi)存中只有一個,可以直接通過調(diào)用類名來調(diào)用,隨著類的加載而加載,類變量是所有對象共有,其中一個對象將它值改變,其他對象得到的就是改變后的結(jié)果
線程
創(chuàng)建多線程:繼承Thread類,實現(xiàn)Runnable接口
繼承Thread類
- 步驟:聲明Thread類的子類,在子類中重新定義run()方法,創(chuàng)建Thread子類的實例,讓線程調(diào)用start()方法
- 注意:用戶不能直接調(diào)用Thread類中的run()方法,需要通過調(diào)用Thread類提供的start()成員方法間接的使用它。通過調(diào)用start()方法初始化后,才能調(diào)用run()方法。run()成員方法執(zhí)行完畢后線程就結(jié)束,并且不能再次啟動
繼承Thread子類,創(chuàng)建線程對象。要求創(chuàng)建兩個線程對象,分別實現(xiàn)顯示‘A'~'D'五個字符的功能
class ThreadOne extends Thread{
public void run(){
for(char s = 'A';s<'F';s++){
System.out.println("正在運行線程“ + getName() +"打印字符為"+s);
}
System.out.println();
System.out.println("線程"+Thread.currentThread().getName+"執(zhí)行結(jié)束,退出");
}
}
public class Test{
public static void main(String args[]){
Thread t1 = new ThreadOne();
t1.setName("T1");
Thread t2 = new ThreadOne();
t2.setName("T2");
t1.start();
t2.start();
System.out.println("主線程"+Thread.currentThread().getName()+"創(chuàng)建兩個子線程完畢,退出");
}
}
實現(xiàn)Runnable()接口
- 步驟:定義一個實現(xiàn)了Runnable接口的類,在類中重載run()方法,定義線程體;創(chuàng)建一個上述類的類對象,以該對象為參數(shù)創(chuàng)建一個Thread類對象;調(diào)用Thread類對象的start()方法,啟動線程
class ThreadTwo{
int i;
public void run(){
for(int i=1;i<=10;i++){
System.out.println("ThreadTwo by Runnable Interface is running ……” + s);
}
}
}
public class Test{
public static void main(String args[]){
ThreadTwo thread = new ThreadTwo();
Thread threadObj = new Thread(thread);
threadObj.start();
}
}
線程狀態(tài)及優(yōu)先級
- 新建狀態(tài)
利用new運算符創(chuàng)建線程對象之后,調(diào)用start()方法之前就是線程的新建狀態(tài)。這時,線程僅僅是一個空對象,系統(tǒng)沒有為他分配資源 - 可運行狀態(tài)
使用start()方法啟動一個線程之后,線程就變成可運行狀態(tài) - 阻塞狀態(tài)
當一個正在CPU上運行的線程由于等待某個事件發(fā)生而讓出CPU時,就進入阻塞狀態(tài)。例如,調(diào)用了sleep()或者wait()成員方法,或者等待I/O設(shè)備資源就緒等。當?shù)却臅r間發(fā)生后,或得到了需要的資源后進程就會重新變?yōu)榭蛇\行狀態(tài) - 死亡狀態(tài)
是線程生命周期的最后一個階段,處于這個狀態(tài)的線程不在具有執(zhí)行的能力。正常運行的線程完成了全部工作或者線程的執(zhí)行被強行終止都可導致線程處于死亡狀態(tài)。 - 線程的優(yōu)先級及調(diào)度
通過調(diào)用Thread類的setPriority()方法改變線程的優(yōu)先級,getPriority()方法獲得該線程的優(yōu)先級
線程控制
- Java的互斥鎖機制
java中的關(guān)鍵字synchronized用來與對象的互斥鎖聯(lián)系。當某個對象用synchronized修飾時,表明該對象在任一時刻只能有一個線程進行訪問。
兩種用法:Synchronized方法和Synchronized塊
1.Synchronized方法——方法同步
講synchronized關(guān)鍵字放在方法錢用于鎖定一個方法,聲明該方法為互斥使用的方法。方法體成為臨界區(qū)。
- 聲明格式:
synchronized<方法聲明>{
<方法體>
}
或
<方法聲明>{
synchronized(this){
<方法體>
}
}
例如:用其修飾sale()方法,使其成為一個臨界區(qū)
class Booking{
private int amount = 90;
public synchronized void sale(int num){
……
}
}
2.synchronized塊——對象同步
將Synchronized關(guān)鍵字放在某代碼塊之前,可以使該代碼塊成為互斥的代碼塊
- 聲明格式:
synchronized<對象名>{
<代碼塊>
}
例如:
public void run(){
synchronized(bt){
bt.sale(num);
}
}