2013-06-07 3 views
-2
class firstThread extends Helper1 
{ 
     Thread thread_1 = new Thread(new Runnable() 
     { 
      @Override 
      public void run() { 
       try { 
        for (int i = 1; i <= 20; i++) { 
         System.out.println("Hello World"); 
         Thread.sleep(500); 
         if (i == 10) { 
          Notify(); 
          Wait(); 
         }      
        } 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     }); 
} 
class secondThread extends firstThread 
{ 
    Thread thread_2 = new Thread(new Runnable() 
    { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       Wait(); 
       for(int i = 1; i<=20; i++) 
       { 
        System.out.println("Welcome"); 
        Thread.sleep(100); 
       } 
       Notify(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

class Helper1 
{ 
    public synchronized void Wait() throws InterruptedException 
    { 
     wait(); 
    } 
    public synchronized void Notify() throws InterruptedException 
    { 
     notify(); 
    } 
} 
public class InheritanceClass { 

    public static void main(String[] args) 
    { 
     Thread f = new Thread(new firstThread().thread_1); 
     Thread s = new Thread(new secondThread().thread_2); 
     f.start(); 
     s.start(); 
    } 



} 

첫 번째 스레드에만 출력이 있습니다. 제 코드를 시험해보십시오. 나는 그것이 왜 일어나는 지 모른다. 두 번째 스레드가 출력을 제공하지 않습니다. secondThread의 Wait() 때문이라고 가정합니다. 어떻게해야할지 모르겠습니다.두 번째 스레드가 출력을 제공하지 않습니다. (java)

+1

http://www.oracle.com/technetwork/java/codeconv-138413.html –

+1

[방금 게시했습니다.] (http://stackoverflow.com/questions/16974206/thread-inheritance-in-java) . 나는 당신에게 코딩과 명명 규칙을 상기시켰다. 너는 그들을 무시했다. -1. – wchargin

답변

0

이 코드는 정말 혼란스럽고 근본적인 문제를보기가 어렵습니다.

  • 클래스는 메소드/필드 이름 (예 : firstThread)처럼 보이기 때문에 소문자로 시작해서는 안됩니다.
  • 나는 WaitNotifysynchronized 일 수밖에 없다는 것을 확신합니다.
  • secondThread이 (가) firstThread을 (를) 상속하는 이유는 무엇입니까 ??? 사실, 왜 그 두 클래스를 가지고 있습니까? 익명의 내부 클래스를 Helper1 또는 무언가로 만들어야합니다.

어쨌든, 문제는 thread1에 Notify()를 호출 할 때 자체하지 thread2 통지 것입니다.

+0

이 코드에서 상속을 구현해야합니다. – herpienne12

+1

@ user2438658 - 익명 내부 클래스가 'Helper1' _is_ 상속을 확장하게합니다. 'secondThread' 확장은'secondThread'에서 실제로'thread_1' 필드를 원하지 않기 때문에'firstThread'를 확장하는 것만으로 어리석은 일입니다.하지만 클래스 계층 구조 때문에 하나가 있습니다. 다른 것이 없다면'secondThread'를'Helper1'을 직접 확장하도록 변경해야합니다. – DaoWen

2

문제는 다음 코드입니다 : 위

class Helper1 
{ 
    public synchronized void Wait() throws InterruptedException 
    { 
     wait(); 
    } 
    public synchronized void Notify() throws InterruptedException 
    { 
     notify(); 
    } 
} 

wait()notify() 통화 this.wait()this.notify()에 해당합니다. 그러나 thread1thread2은 별도의 개체이므로이 메서드를 통해 통신하지 않습니다.

통신이 발생하려면 공유 잠금 개체가 필요합니다. 같은

Object lock = new Object(); 
firstThread = new firstThread(lock); 
secondThread = new secondThread(lock); 

및 동기화 : 예를 들어

void wait(Object lock) { 
    synchronized(lock) { 
     lock.wait(); 
    } 
} 

void notify(Object lock) { 
    synchronized(lock) { 
     lock.notify(); 
    } 
} 

면책 조항 : 나는 개인적으로이 작업을 수행하지 않을 것 그러나 그것은 OP의 질문에 대답한다.

관련 문제