마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바 변수 공유 / 멀티 스레드or 게임 프로그래밍 대해 잘 아시는 분ㅠㅠ

0 추천

제가 쓰레드에 대해 잘몰라서 구조를 이상하게 짠거같은데..어떻게 처리해야할지 몰라서 

 

경험있으신 개발자님들에게 이렇게 조언을 구하고자 문의를 남깁니다.

 

일단 

 

1.PressureAnalysis(싱글톤) 라는 class가 있습니다. (이하 1번 클래스)

2.workerMng 라는 클래스가 있습니다. (이하 2번 클래스)

 

1번클래스에서 별도 스레드가 돌면서 맴버변수인  

ArrayList<Integer> SignalMember와 

ArrayList<Boolean>ChangeSignal 변수의 값을 바꿔주고 있습니다.

 

방식은 SignalMember변수의 값이 변할때 ChangeSignal변수의 값을 true로 만들어줍니다.

 예시)변수명은 예시용이라 헷갈릴수도있으니, 대략이렇게 작동하는거만 이해해주시면...

if(m_mapLastSignalMember.get(sPos).get(i) != nSignalVal){ // 값이 바뀜
	m_mapChangeSignal.get(sPos).set(i, true); //상태를 true
    m_mapLastSignalMember.get(sPos).set(i,  nSignalVal);

}

  

이렇게 1번클래스의 스레드가 작동합니다.

 

문제는 2번 클래스의 스레드입니다.

2번클래스의 스레드는

1번클래스의 맴버변수 ChangeSignal변수의 값을 가져와서 true이면

 SignalMember변수의 값을 가져와서 작업을 합니다.

if(pam.getChangeSignal(PressureSignal.SIG_LEFT , i)){ 
//1번클래스의 맴버변수가 true인지 확인(위에서도 말했듯이 1번클래스의 스레드에서 SignalMember변수의 값이 변할때 ChangeSignal변수의 값을 true로 해줍니다)
		drawSensorEffect("hidden-left-box" , i , mapFootPressureColor.get(sPressGrade)); //ui를 그려주는 작업
			
		am.setChangeSignal(PressureSignal.SIG_LEFT , i, false); //다시 false로 만들어줌
}	

 

 1번 클래스에서  SignalMember값이 바뀌고 ChangeSignal변수를 true만들어주는데요.

그럼 2번 클래스의 스레드에서는  true를 확인하고  SignalMember값을 확인하는 과정에서

2개의 스레드가 동시에 도니까 작업순서가 일정하지않아 

2번 클래스가  SignalMember값을 제대로 못가져오는 문제가 생깁니다. ㅠㅠ 

 

아 설명이 너무 어려운거같은데..

예를들어서 1번클래스에서 true / 값이 20으로 바뀌었습니다.

 

그럼 2번클래스에서는 true확인하고 20인 값을 가져와야하는데...

그 과정에서 1번클래스는 true / 값이 30으로 바뀐상태..

그럼 2번클래스에서는 20인값을 안가져오고 30인값을 가져옵니다. ㅠㅠ

 

제가 구조를   / 스레드를 잘못사용하고있나요?

 

어떻게 해야할지 잘모르겠습니다. 팁이나 조언 많이 부탁드립ㄴ다.

 

 

 

뇽뇽이2841 (1,120 포인트) 님이 2015년 12월 2일 질문

3개의 답변

0 추천
값을 쓰레드 내에 직접 쓰지 말고 사용할 쓰레드 쪽으로 핸들러를 통해 전달하세요 그럼 순차적으로 처리 됩니다.
aucd29 (218,390 포인트) 님이 2015년 12월 3일 답변
0 추천
멀티스레드에 대한 공부부터 하세요.

http://www.kangcom.com/sub/view.asp?sku=200807140001
익명사용자 님이 2015년 12월 3일 답변
0 추천
이런경우에는 ArrayList<Integer> SignalMember와 ArrayList<Boolean>ChangeSignal 을 가지는 클래스를 별도로 사용하시면 됩니다. 그리고, 별도의 클래스에서는 Lock을 사용해서 setter, getter 메서드의 접근을 제어하시면 될 것 같습니다.
mcsong (44,040 포인트) 님이 2015년 12월 3일 답변
...