1. 使用wait和notify方法
創(chuàng)新互聯(lián)主要業(yè)務有網(wǎng)站營銷策劃、做網(wǎng)站、成都網(wǎng)站設計、微信公眾號開發(fā)、重慶小程序開發(fā)公司、HTML5建站、程序開發(fā)等業(yè)務。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、成都全網(wǎng)營銷推廣資源和合作伙伴關系資源,并逐漸建立起規(guī)范的客戶服務和保障體系。
這個方法其實是利用了鎖機制,直接貼代碼:
public class Demo1 extends BaseDemo{ private final Object lock = new Object(); @Override public void callback(long response) { System.out.println("得到結果"); System.out.println(response); System.out.println("調(diào)用結束"); synchronized (lock) { lock.notifyAll(); } } public static void main(String[] args) { Demo1 demo1 = new Demo1(); demo1.call(); synchronized (demo1.lock){ try { demo1.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主線程內(nèi)容"); } }
可以看到在發(fā)起調(diào)用后,主線程利用wait進行阻塞,等待回調(diào)中調(diào)用notify或者notifyAll方法來進行喚醒。注意,和大家認知的一樣,這里wait和notify都是需要先獲得對象的鎖的。在主線程中最后我們打印了一個內(nèi)容,這也是用來驗證實驗結果的,如果沒有wait和notify,主線程內(nèi)容會緊隨調(diào)用內(nèi)容立刻打印;而像我們上面的代碼,主線程內(nèi)容會一直等待回調(diào)函數(shù)調(diào)用結束才會進行打印。
沒有使用同步操作的情況下,打印結果:發(fā)起調(diào)用 調(diào)用返回 主線程內(nèi)容 得到結果 1 調(diào)用結束
而使用了同步操作后:
發(fā)起調(diào)用 調(diào)用返回 得到結果 9 調(diào)用結束 主線程內(nèi)容2. 使用條件鎖
和方法一的原理類似:
public class Demo2 extends BaseDemo { private final Lock lock = new ReentrantLock(); private final Condition con = lock.newCondition(); @Override public void callback(long response) { System.out.println("得到結果"); System.out.println(response); System.out.println("調(diào)用結束"); lock.lock(); try { con.signal(); }finally { lock.unlock(); } } public static void main(String[] args) { Demo2 demo2 = new Demo2(); demo2.call(); demo2.lock.lock(); try { demo2.con.await(); } catch (InterruptedException e) { e.printStackTrace(); }finally { demo2.lock.unlock(); } System.out.println("主線程內(nèi)容"); } }
基本上和方法一沒什么區(qū)別,只是這里使用了條件鎖,兩者的鎖機制有所不同。
如果是非靜態(tài)的方法1調(diào)用非靜態(tài)的方法2,那么
非靜態(tài)方法2所在類的實例引用.非靜態(tài)方法2
public class Test{
public void getMethod(){
Test t=new Test();
t.getTwoMethod();
}
public void getTwoMethod(){
}
}
如果靜態(tài)調(diào)用靜態(tài):
public class Test{
public static void main(String[]args){
Hello();
}
public void Hello(){
System.out.println("HELLOWORLD")
}
}
如果是繼承的話:
public class a{
public void jj(){}
}
public class b extends a {
public void hh(){
super.jj();
}
}
感覺你的基本概念不清楚,建議你從頭認真看下JAVA的一些基本概念。
針對你提的問題解答如下:
calc(int n)是一個方法
System.out.println("10的階乘為:"+calc(10)); 中的calc(10)表示調(diào)用calc方法,同時將10傳遞給方法的形參n,這樣n=10(這個表示等于,相當于程序中的==,下同).
而在calc()方法內(nèi)部,是說如果n=1,方法就返回結果1,如果不等于就返回n * calc(n-1)。而這個時候的calc(n-1)又再一次調(diào)用calc方法,同時將n-1傳遞給方法的形參n,這樣n=9
如此循環(huán)調(diào)用,直到最后一次n=1時方法直接返回1.
所以calc()方法求的是n的階乘,也就是n*(n-1)*(n-2)*...*2*1
public class HelloWord{
//自定義的輸出函數(shù),打印字符串helloword!
public void printHelloWord() {
System.out.println("helloword!");
}
public static void main(String args[]){
//創(chuàng)建對象實例
HelloWord hw = new HelloWord();
//通過對象實例調(diào)用自己的成員函數(shù)
hw.printHelloWord() ;
}
}
你看看滿意不?