- 回调函数回顾
顾名思义,当A类调用B类某个方法时,该方法再调用A类的某个方法,即回调A了,而怎么回调呢?当A类调用B类的某个方法时则需要传一个A类父类接口即可,这样调用B类的方法时,这个方法可以获取传过来的A类父类接口进行回调了。
2.实现进度条思路
前端通过两个接口进行获取参数,第一个接口是传达下载的命令,第二个接口是每秒钟获取进度条的进度。
3.A类代码
package com.example.yurgqg.callback;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class A implements Callback {
private B b;
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public A(B b) {
this.b = b;
}
public void xiazai(String file) {
b.xiazai(this, file);
}
@Override
public void callBackJinDu(String jindu) {
this.message = jindu;
}
}
4.B类代码
package com.example.yurgqg.callback;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock;
public class B extends Thread {
private ReentrantLock lock = new ReentrantLock();
public void xiazai(Callback callback, String fileName) {
callback.callBackJinDu(fileName + "下载开始!");
CountDownLatch countDownLatch = new CountDownLatch(10);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
for (int i = 1; i <= 100; i++) {
if (i % 10 == 0) {
try {
Thread.sleep(2000);
callback.callBackJinDu("当前进度:" + i + "%");
Thread.sleep(2000);
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
lock.unlock();
}
});
thread.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
callback.callBackJinDu(fileName + "下载结束!");
}
}
5.Callback接口类
package com.example.yurgqg.callback;
public interface Callback {
void callBackJinDu(String jindu);
}
6.CallbackController类
package com.example.yurgqg.callback;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/yu")
public class CallbackController {
public static final A a = new A(new B());
@GetMapping("/xiazai")
public void xiazai(@RequestParam("name") String name){
a.xiazai("活着");
}
@GetMapping("/callback")
public Map<String,Object> res(){
Map<String,Object> map = new HashMap<>();
map.put("count",a.getMessage());
return map;
}
}
7.效果图
8.写在最后
鄙人不才,若高人不吝赐教,吾将从之。