본문 바로가기
Development/Android

[안드로이드] Thread 메소드 동기화

by 푸민 2015. 9. 23.
반응형


안녕하세요 푸민입니다.


안드로이드 프로그래밍에서 Thread 를 빼놓을 수 없죠!!

주로 서버 연결하여 데이터 가져올때 많이 사용하고, 뭐 백단에서 돌릴때 굉장히 많이 사용합니다!

특히나 서버 연결은 안드로으대 프로그래밍에 가장 큰 부분을 차지하죠 ㅎㅎ


그런데 Thread 사용중에 다중 Thread 를 사용할 경우 문제가 발생합니다.


private class MyThread extends Thread{

public void run() {

http();

}

}

 

public void http(){

String url = "";//주소

HttpPost post = new HttpPost(url);//포스트객체생성


List<NameValuePair> params = new ArrayList<NameValuePair>();//파라미터

params.add(new BasicNameValuePair("id", id.getText().toString()));

params.add(new BasicNameValuePair("pw", pw.getText().toString()));

params.add(new BasicNameValuePair("name", name.getText().toString()));

params.add(new BasicNameValuePair("age", age.getText().toString()));


UrlEncodedFormEntity ent = null;


try {

ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);

} catch (UnsupportedEncodingException e1) {

e1.printStackTrace();

}

post.setEntity(ent);

HttpParams httpParameters = new BasicHttpParams();

int timeoutConnection = 10000;

HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);


int timeoutSocket = 5000;

HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);


DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);


HttpResponse response;


try {

response = httpClient.execute(post);

HttpEntity entity = response.getEntity();

if(entity!=null){

String check22 = EntityUtils.toString(entity);

test(check22);

}

else{

}

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}


서버에서 결과가 오면 동작을 하도록하는 test() 메소드를 부르도록 프로그래밍 했는데요.

해당 결과가 한번이 아니라 여러번이 올 수 있고, 또 동시에 불릴수도 있습니다.


JoinThread joinThread = new JoinThread();

joinThread.start();

JoinThread joinThread2 = new JoinThread();

joinThread2.start();


이렇게 두번 연속해서 부를 경우 test() 메소드가 동시에 불리수 있습니다. 네트워크 상황에 따라 안 겹칠수도 있지만, 모든상황을 고려해야죠!


메소드 내에서의 처리를 할때 동시에 여러번 불릴 경우 예를 들어 파라미터가 다르게 들어올 수 있고, 또 내부에서 비정상적으로 두번 실행될 수도 있습니다.


그래서 이런 현상을 방지하기 위해 메소드를 동기화 시키면 됩니다.


synchronized public void test(String str){

   ...

}


메소드 앞에 synchronized 라는 예약어를 붙이게 되면 해당 메소드는 무조건 한번씩만 불립니다. 예를 들어 joinThread joinThread2 에서 동시에 들어온다고 해도 먼저 들어온거 처리하고 그다음에 뒤에 들어온것을 처리합니다.


Thread 를 사용할 경우 데이터 겹치는 문제, 처음 생각했던 플로우를 잘 따르기 위해서는 동기화를 항상 조심해야 됩니다!
































반응형

댓글