2014-12-09 4 views
0

스레드가 인터럽트되었을 때 객체 속성을 변경할 수 있습니까?Java : 스레드가 인터럽트되었을 때 객체 속성을 변경하십시오.

내가 하나 개의 스레드를 중단하고 클릭 한 셀의 속성 중 하나의 값을 변경하려면 셀을 클릭 할 때 내가

if(!clickedCell.isSnake()) { 
     for(Snake snake : board.getSnakeList()) { 
      if(snake.isSelected()) { 
       snake.interrupt(); 
      } 
     } 
    } 

이 가능합니다 보드 (셀 매트릭스)를 가지고 인터럽트 예외를 catch하고

try{ 
    //some code; 
    } catch (InterruptedException ex){ 
    // how do i catch the cell's x and y here so that i can do something like 
    // snake.setFinalCell(clickedCell); 
    } 
    finally{ 
     notifyAll(); 
    } 

감사합니다.

+3

무엇 클릭 한 셀을 어딘가에 저장하고 catch 부분의 속성에 액세스하는 방법에 대해 설명합니다. – Smutje

+2

스레드가 개체가 아닙니다. 객체에는 "해당"스레드가 없습니다. 스레드를 인터럽트해도 일시 중단되지 않습니다. 'notifyAll'은 그것을 다시 시작하지 않습니다. Java는 스레드 일시 중단을 지원하지 않습니다. –

+0

@Smutje : 정적 변수를 좋아합니까? – znaya

답변

0

인터럽트 된 예외를 catch 할 수는 있지만 스레드 간 통신을 수행하는 것은 권장되지 않습니다. wait()notify()을 사용하여 리소스에 대한 액세스를 동기화해야합니다.

+0

'wait'와'notify'는 사용하지 말라. 사실상 비난 받기는하지만, 초보자는 반드시 지시를 받아서는 안된다. 'java.util.concurrent'의 동시성 도우미가 대신 사용되며, 아무 것도 작동하지 않더라도'wait-notify'를위한 1 대 1 대체물 인 저수준'LockSupport' 클래스가 있습니다 , 사마귀 만 제거되었습니다. –

+0

프로젝트에서 내가 끝내려고하는 것은 정확하게 우리가 사용하기를 기대하고 기다리고 알리는 것입니다! 나는 daniel liang의 자바 프로그래밍을 기본 서지로 사용하고 있지만 책을 좋아하지만 멀티 스레딩과 관련된 주제에는별로 도움이되지 않습니다. 왜냐하면 여러분이 말했듯이, 기다리고 알리는 것이 실망 스럽거나 쓸모없는 것 같습니다. 약간. – znaya

+0

@MarkoTopolnik 기다림/알림에 대한 나에게 URL을 알려주십시오. 내가 실망시킨 것에 대해 발견 한 것은 Thread.join javadoc뿐이었습니다. 그러나 Thread 인스턴스에 대한 실망감으로 인해 일반적으로 실망하지 않았습니다. – outdev

0

각 스레드는 자신의 명령 포인터와 호출 스택을 가져 스레드가 현재 코드의 위치를 ​​알 수 있도록합니다.

스레드가 자체 메모리를 확보하지 못합니다. 모든 스레드는 동일한 메모리를 공유하므로 두 스레드에서 동일한 객체에 액세스 할 수 있습니다. 포인터로 생각하면 두 스레드 모두 동일한 메모리 주소에 대한 포인터를 가질 수 있습니다.

방금 ​​시도하면 오랫동안 정상적으로 작동하는 것을 알 수 있습니다. 그런데 버그가 발생할 것입니다. 그 이유는 다른 스레드가 객체에 쓰는 동안 (또는 둘 다 쓰는 동안) 한 스레드가 객체에서 읽을 수 있기 때문입니다. 그 상황을 피하려면, 당신은 하나 개의 스레드가 동시에

synchronized(lockObject) { 
    // Access shared variables and other shared resources 
} 

에서 개체에 액세스 할 수있는 자바 말할 수 있습니다 예를 들어, 다음과 같은 (의사 코드) 할 수있는 경우 :

class CellSynchronizer { 
    Object lockObject = new Object(); 
    Cell currentCell; 

    void setCurrentCell(Cell cell) { 
     synchronized (lockObject) { 
      currentCell=cell; 
     } 
    } 

    boolean isSelected() { 
     synchronized (lockObject) { 
      return currentCell.isSelected(); 
     } 
    } 

} 
관련 문제