扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1. 使用wait和notify方法
创新互联主要业务有网站营销策划、做网站、成都网站设计、微信公众号开发、重庆小程序开发公司、HTML5建站、程序开发等业务。一次合作终身朋友,是我们奉行的宗旨;我们不仅仅把客户当客户,还把客户视为我们的合作伙伴,在开展业务的过程中,公司还积累了丰富的行业经验、成都全网营销推广资源和合作伙伴关系资源,并逐渐建立起规范的客户服务和保障体系。
这个方法其实是利用了锁机制,直接贴代码:
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("调用结束"); 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("主线程内容"); } }
可以看到在发起调用后,主线程利用wait进行阻塞,等待回调中调用notify或者notifyAll方法来进行唤醒。注意,和大家认知的一样,这里wait和notify都是需要先获得对象的锁的。在主线程中最后我们打印了一个内容,这也是用来验证实验结果的,如果没有wait和notify,主线程内容会紧随调用内容立刻打印;而像我们上面的代码,主线程内容会一直等待回调函数调用结束才会进行打印。
没有使用同步操作的情况下,打印结果:发起调用 调用返回 主线程内容 得到结果 1 调用结束
而使用了同步操作后:
发起调用 调用返回 得到结果 9 调用结束 主线程内容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("调用结束"); 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("主线程内容"); } }
基本上和方法一没什么区别,只是这里使用了条件锁,两者的锁机制有所不同。
如果是非静态的方法1调用非静态的方法2,那么
非静态方法2所在类的实例引用.非静态方法2
public class Test{
public void getMethod(){
Test t=new Test();
t.getTwoMethod();
}
public void getTwoMethod(){
}
}
如果静态调用静态:
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)表示调用calc方法,同时将10传递给方法的形参n,这样n=10(这个表示等于,相当于程序中的==,下同).
而在calc()方法内部,是说如果n=1,方法就返回结果1,如果不等于就返回n * calc(n-1)。而这个时候的calc(n-1)又再一次调用calc方法,同时将n-1传递给方法的形参n,这样n=9
如此循环调用,直到最后一次n=1时方法直接返回1.
所以calc()方法求的是n的阶乘,也就是n*(n-1)*(n-2)*...*2*1
public class HelloWord{
//自定义的输出函数,打印字符串helloword!
public void printHelloWord() {
System.out.println("helloword!");
}
public static void main(String args[]){
//创建对象实例
HelloWord hw = new HelloWord();
//通过对象实例调用自己的成员函数
hw.printHelloWord() ;
}
}
你看看满意不?
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流