2012-01-15 2 views
1

스레드의 개념을 완전히 이해하지 못했습니다. 몇 가지 질문이 있습니다.스레드가 완료되면 코드 실행을 확인하십시오.

ExecCommand.java

// I don't know how this work, for now 
package therads; 

// Here we will have the methods and run them from the Main.java 
public class ExecCommand implements Runnable 
{ 
    String name; 
    int time; 

    public ExecCommand(String s,int amount) 
    { 
     name = s; 
     time = amount; 
    } 

    // Run method (Runnable) 
    public void run() 
    { 
     try 
     { 
      // What to execute when the thread is started 
      System.out.printf("%s is sleeping for %d\n",name,time); 
      Thread.sleep(time); 
      System.out.printf("%s is done\n",name); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

    // This dosen't work when the thread is stopped 
    public void stop() 
    { 
     try 
     { 
      System.out.printf("STOPPED!"); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

    // This dosen't work when the thread is started 
    public void start() 
    { 
     try 
     { 
      System.out.printf("Started!"); 
     } 
     catch(Exception e) 
     { 

     } 

    } 
} 

와 내가 그를 전화 :

Main.java

Thread t5 = new Thread(new ExecCommand("Good Function",1000)); 
t5.start(); 
  1. 내가 원하는 우리는 다음과 같은 코드가 있다고 가정 ~ println() 스레드가 시작되면 "시작됨", 완료되면 "중지됨". 것이 가능하다?

  2. 스레드가 완료되면 메모리에서 완전히 종료됩니다. 그렇지 않다면 어떻게 할 수 있습니까?

  3. 키를 누를 때까지 1000 밀리 초마다 한 번씩 반복되는 스레드를 만들 수 있습니까? 나는에 대해 생각하고 있었다 while(true) { t5.start; }

나는 잘 모른다.

답변

5

우선, startstop 방법을 사용할 필요가 없습니다. 모든 것은 run 메소드에서 발생합니다.

시작 및 중지시 메시지를 인쇄하려면 run 메서드의 시작과 끝 부분에 메시지를 넣으십시오. 무한 루프와 외부 이벤트가 발생할 때까지 코드를 실행 유지하기 위해 그 위에 플래그와 루프를 사용

class ThreadTask implements Runnable { 
    private volatile boolean flag = false; 

    public void setFlag(boolean value) { 
     flag = value; 
    } 

    public void run() { 
     System.out.println("Started"); 
     while(!flag) { 
      // execute code 
     } 
     System.out.println("Stopped"); 
    } 
} 

을 그런 다음 스레드를 중지 할 때, 단지 진정한 setFlag를 사용하여 플래그를 설정합니다.

예, 스레드는 run 메소드가 종료 된 후 런타임 + OS에 의해 자동으로 정리됩니다.

+0

while 루프에서 try {...} catch (InterruptedException e) (...} catch를 추가하는 것이 좋겠지 만 이는이 jist입니다. –

+0

감사합니다. 시도해 보겠습니다 :) – Master345

+0

작동합니다 완벽하게, 나는 또한 스레드를 반복 할 얼마나 많은 시간을 추가했습니다. – Master345

0

시작 및 중지 방법을 재정의하지 않아도됩니다. 콜백 메소드가 아닙니다.

원하는 것은 SwingWorker 클래스와 비슷합니다 (UI 관련 스레딩 동기화에 관심이 있다고 가정).

그렇지 않으면 스레드를 서브 클래스로 만들고 콜백 메커니즘을 제공 할 수 있습니다.

+0

그래서 start() 및 stop()을 수행 할 이유가 없다고 말하고 있습니까? – Master345

+0

시작 및 중지 메소드가 호출됩니다. 콜백 메소드가 아닙니다. –

3

.start() 및 .stop()이 호출되는시기 또는시기는 언제입니까? Runnable에는 인터페이스에 단 하나의 메소드 만 있습니다. .운영(). JavaDocs for Thread는 그것을 잘 설명합니다. http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html. 스레드가 시작될 때 어떤 일이 일어나기를 원한다면 .run() 맨 위에 그 내용을 넣으십시오. 스레드가 완료 될 때 어떤 일이 발생하게하려면 .run()의 맨 아래에 놓습니다. By-in-large는 Thread의 .start() 및 .stop() 메서드를 사용하여 아무 것도하지 않는 것이 좋습니다. .run() 내 모든 라이프 사이클 작업을 집중하십시오. 그리고 Goetz는 "Java Concurrency in Practice"의 사본을 얻습니다. 옵션의 전체 범위를 보여줍니다 (스레딩을 직접 소유하지 마십시오).

+0

답변을 주셔서 감사합니다. 내 머리 속에 거대한 논리를 만들었지 만 큰 책을 읽는 것이 다소 잔인하다고 생각하지 않습니까? 그 녀석의 튜토리얼을 유튜브로 제작하는 것은 정말 재미 있습니다 : D – Master345

+0

@RowMinds. JCiP가 다루는 내용은 그다지 크지 않습니다. 스레딩을 잘못하면 프로그램이 엉망이 될 수 있습니다. JCiP는 작동 원리를 이해할 수있는 적절한 위치에 머리를 놓을 것입니다. 그러면 두려움없이 그것을 쓸 수 있습니다. 그것을 커버하는 비디오를 발견했다면, 그것을 가지고 있습니다. 그림은 천 단어입니다, 맞죠? –

+0

당신은 내가 읽어야 할 것 같아요, 심지어 때로는 프로그래밍에 대한 아주 지루한 독서가 오히려 힘들 때도 있지만, 오히려 셰익스피어를 읽었을 것 같아요.하지만 그게 끝나면, 고마워요 :) – Master345

0
  1. 물론 있습니다. 당신은 그냥 인쇄하려면 run() 방법의 첫 번째 줄의 "시작"할 수 있으며, 인쇄가 "정지"중 run() 방법의 finally 섹션하거나 t5.join()
  2. 후에는 세부 사항에 대해 이야기되지 않고, 아무것도 할 수 없습니다. 그러나 리소스가 필요한만큼 빨리 해제된다고 가정 할 수 있습니다. (당신이 당신의 스레드에서 할당 된 참조에 대한 도달 링크가있는 경우 물론, JVM은 적절한 단어가 여기에없는 이들은 아무 소용 것을 결정, 그래서 "완료"할 수 없습니다.)
  3. java.util.Timer
에서보세요
0
  1. printf 대신 System.out.println을 사용하려면 해당 코드 줄을 바꾸기 만하면됩니다. 이러한 호출에 관한 스레드 관련 정보는 없습니다.
  2. 스레드가 실행을 중지하고 스레드에 대한 라이브 참조가 없을 때 가비지 수집기가 스레드를 수집하고 메모리에서 해제합니다. 모든 객체와 동일합니다.
  3. stop()을 재정의하지 마십시오. 이 코드는 deprecated이고 실제로 응용 프로그램 코드가 아니라 JVM에서 처리해야합니다. docs
  4. 당분간은 Thread.sleep을 사용하여 잠자기 상태로 만들 수 있습니다. 스레드가 원하는대로 구현하려면 run을 무시하십시오. 잠자기 시간은 플랫폼 및 사용 가능한 시스템 클럭의 해상도에 따라 다릅니다.
관련 문제