비동기를 통해 실행되는 곳은 새로운 Thread를 이용해 작동시켜야 한다. 그렇지 않으면 Main Thread가 blocking되어 비동기를 구현하는 의미가 없어진다.
public interface Loader {
public void onProgressUpdate(String progress);
public void onComplete(String url);
}
public class FileLoader implements Loader {
@Override
public void onProgressUpdate(String progress) {
System.out.println(progress);
}
@Override
public void onComplete(String url) {
System.out.println(url);
}
}
public class VideoDownLoader{
private Loader fileLoader;
public VideoDownLoader(Loader fileLoader){
this.fileLoader=fileLoader;
}
public void execute(){
System.out.println("다운로드 시작");
try{
for(int i=1;i<=10;i++){
fileLoader.onProgressUpdate("진행중... "+i*10+"%");
Thread.sleep(1000);
}
fileLoader.onComplete("다운로드 완료!");
}catch (Exception e){}
}
}
public class VideoDownLoader{
private Loader fileLoader;
public VideoDownLoader(Loader fileLoader){
this.fileLoader=fileLoader;
}
public void execute(){
new Thread(()->{
try{
for(int i=1;i<=10;i++){
fileLoader.onProgressUpdate("진행중... "+i*10+"%");
Thread.sleep(1000);
}
fileLoader.onComplete("다운로드 완료!");
}catch (Exception e){}
}).start();
}
}
public class Main {
public static void main(String[] args){
VideoDownLoader videoDownLoader=new VideoDownLoader(new FileLoader());
videoDownLoader.execute();
System.out.println("=============================");
System.out.println(Thread.currentThread().getName());
System.out.println("=============================");
}
}
다운로드 시작
진행중... 10%
진행중... 20%
진행중... 30%
진행중... 40%
진행중... 50%
진행중... 60%
진행중... 70%
진행중... 80%
진행중... 90%
진행중... 100%
다운로드 완료!
=============================
main
=============================
다운로드 시작
=============================
main
=============================
진행중... 10%
진행중... 20%
진행중... 30%
진행중... 40%
진행중... 50%
진행중... 60%
진행중... 70%
진행중... 80%
진행중... 90%
진행중... 100%
다운로드 완료!