

아래 코드는 버튼을 클릭할 때마다 새로운 스레드가 시작되어 text2가 여러 스레드에 의해 업데이트되는 현상을 방지하기 위해,
깜빡임 중복 실행을 막는 코드를 추가한 예제입니다.
즉, 이미 깜빡임이 진행 중이면 새 스레드를 실행하지 않고 그대로 두도록 합니다.
주석으로 [텍스트2 깜빡임 중복 실행 방지] 부분을 표시해두었으니 참고하세요.
// 버튼 클릭 시 a-z까지 text2 출력(깜빡임) - 이벤트 처리
btn.addActionListener((e) -> {
// [텍스트2 깜빡임 중복 실행 방지]
// 이미 깜빡임 중이면 새 스레드를 실행하지 않도록 처리
if (isBlinking) {
return; // 아무 작업도 하지 않음
}
// 깜빡임 시작 전에 isBlinking을 true로 설정
isBlinking = true;
blinkThread = new Thread(() -> {
// 'A'부터 'z'까지 반복하면서 깜빡임 구현
for (char ch = 'A'; ch <= 'z' && isBlinking; ch++) {
final char currentChar = ch; // ch 값을 final 변수에 저장
SwingUtilities.invokeLater(() -> text2.setText(currentChar + " "));
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
// 인터럽트 발생 시 반복 종료
break;
}
}
// 반복 종료 후 깜빡임 상태 초기화
isBlinking = false;
});
blinkThread.start();
});
[텍스트2 깜빡임 중복 실행 방지]
기존 코드에서는 버튼을 클릭할 때마다 새로운 스레드가 생성되어 실행되므로, 여러 번 클릭하면 여러 스레드가 동시에 text2를 업데이트하여 속도가 빨라지는 현상이 발생합니다.
이를 막기 위해 if (isBlinking) { return; } 코드를 추가하여, 이미 깜빡임이 진행 중일 경우에는 새 스레드를 시작하지 않습니다.
isBlinking 설정
버튼 클릭 시 깜빡임을 시작하기 전에 isBlinking을 true로 설정하여, 이미 깜빡이는 상태임을 표시합니다.
람다식 내부 final 변수 사용
for문 내의 ch는 변경되므로, 이를 final 변수인 currentChar에 할당하여 SwingUtilities.invokeLater()에서 안전하게 사용할 수 있도록 합니다.
이렇게 수정하면, text1의 업데이트 속도는 그대로 유지되고, text2는 버튼 클릭 시 중복 실행 없이 깜빡임 효과가 정상적으로 동작합니다.