안녕하세요 초보개발자입니다.
다름이아니라 요즘 최적화에 관심이 많아
Threadpooling 기법에 대해 공부를 하고 있습니다. 기존에 통신할 때 AsyncTask를 주로 사용했습니다.
테스트를 해보고 싶어 간단한 예제를 만들어보았습니다.
AsyncTask로 구현한 예제 Main.class
for (int i = 0; i < 1000; i++) {
new Task().execute();
}
public class Task extends AsyncTask<Void, Void, Void>{
private String[] arrText = { "111", "222", "333", "444" };
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Random r = new Random();
System.out.println(++gidx + ":myId:" + Thread.currentThread().getId());
System.out.println("arrText:" + arrText[Math.abs(r.nextInt()) % arrText.length]);
if (gidx == 1000) {
long etime = System.currentTimeMillis();
System.out.println(etime-stime+"초");
}
}
}
Threadpool class 예제
long stime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
// 테스트 쓰레드 1000개를 만들어서 콜한다.
new Thread(new Runnable() {
public void run() {
ThreadPoolTester t = new ThreadPoolTester();
t.process("system");
}
}).start();
;
}
long etime = System.currentTimeMillis();
System.out.println(etime-stime+"초");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ThreadPoolTester.destroyTester();
public static class ThreadPoolTester {
private static final ExecutorService threadPool = Executors.newFixedThreadPool(30);
public static void initTest() {
}
public static void destroyTester() {
threadPool.shutdown();
}
private static int gidx = 0;
private String[] arrText = { "111", "222", "333", "444" };
public void process(String request) {
threadPool.execute(new Runnable() {
public void run() {
Random r = new Random();
System.out.println(++gidx + ":myId:" + Thread.currentThread().getId());
System.out.println("arrText:" + arrText[Math.abs(r.nextInt()) % arrText.length]);
}
});
}
}
테스트 결과
AsyncTask 는 평균 389ms
Threadpool는 스레드 3개로 했을 시 평균 945ms
10개로 했을 때 AsyncTask 와 비슷한 결과값이 나왔습니다.
여기서 제가 궁금한건 스레드가 적고 빠른 AsyncTask 가 더 효율적이라고 판단이 되는데
이 생각이 맞는 생각인지 궁금합니다...
잘 아시는분 조언 부탁드립니다.