programing

같은 스레드에서 시작 메서드를 두 번 호출하는 것이 합법입니까?

bestcode 2022. 9. 28. 00:14
반응형

같은 스레드에서 시작 메서드를 두 번 호출하는 것이 합법입니까?

는 '하다, 하다, '로 이어집니다.java.lang.IllegalThreadStateException: Thread already started가 했을 때start()프로그램에서 두 번째로 메서드를 사용합니다.

updateUI.join();    

if (!updateUI.isAlive()) 
    updateUI.start();

이것은 두 번째에 일어난다.updateUI.start()이렇게 여러 번 나서 다시 한 번 밟아봤는데요.updateUI.start().

" "updateUI.run()에러는 회피하지만, 스레드는 UI 스레드(SO의 다른 투고에 기재되어 있는 콜링 스레드)로 동작합니다.을 사용법

스레드는 한 번만 시작할 수 있습니까?이 경우 스레드를 다시 실행하려면 어떻게 해야 합니까?이 특정 스레드는 백그라운드에서 계산을 수행하는데, UI 스레드보다 스레드에서 수행하지 않으면 사용자가 비정상적으로 오래 기다립니다.

메서드의 Java API 사양에서 다음을 수행합니다.

스레드를 한 번 이상 시작하는 것은 결코 합법적이지 않습니다.특히 스레드는 실행이 완료된 후에는 재시작되지 않을 수 있습니다.

더 나아가:

★★★★★★★★★★★:
IllegalThreadStateException - 스레드가 이미 시작된 경우.

네, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,Thread아, 네, 네, 네, 네.

이 경우 스레드를 다시 실행하려면 어떻게 해야 합니까?

「」의 'Thread번 새로운 .그러면 새로운 인스턴스를 작성해야 합니다.Thread를 호출합니다.start위에.

정확히 맞아.매뉴얼에서 다음 항목을 참조하십시오.

스레드를 한 번 이상 시작하는 것은 결코 합법적이지 않습니다.특히 스레드는 실행이 완료된 후에는 재시작되지 않을 수 있습니다.

반복적인 연산에 대해 Swing Utilities invoke Later 메서드를 사용할 수 있는 것 같습니다.이미 통화 실험을 하고 있습니다.run()직접적으로', ' '아', '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,RunnableThread 을.invokeLater의 the만의 Runnable그게 당신의 정신 패턴에 좀 더 잘 맞는지 알아보세요.

다음으로 설명서의 예를 제시하겠습니다.

 Runnable doHelloWorld = new Runnable() {
     public void run() {
         // Put your UI update computations in here.
         // BTW - remember to restrict Swing calls to the AWT Event thread.
         System.out.println("Hello World on " + Thread.currentThread());
     }
 };

 SwingUtilities.invokeLater(doHelloWorld);
 System.out.println("This might well be displayed before the other message.");

「」를 하면,println당신의 계산으로 전화를 걸면, 당신에게 딱 맞는 것일지도 모릅니다.

편집: 코멘트를 팔로우 할 때, 원래 투고에 Android 태그가 있는 것은 몰랐습니다.하는 것과 은 Android입니다.Handler.post(Runnable): . javadoc :: :

/**
 * Causes the Runnable r to be added to the message queue.
 * The runnable will be run on the thread to which this handler is
 * attached.
 *
 * @param r The Runnable that will be executed.
 *
 * @return Returns true if the Runnable was successfully placed in to the
 *         message queue.  Returns false on failure, usually because the
 *         looper processing the message queue is exiting.
 */

따라서위와 하여 Android RSA를 할 수 .Swingutilities.invokeLater 적절한 Handler.

방금 도착한 답변은 왜 당신이 지금 하고 있는 일을 하면 안 되는지에 대한 것입니다.여기 실제 문제를 해결하기 위한 몇 가지 옵션이 있습니다.

이 특정 스레드는 백그라운드에서 계산을 수행하는데, UI 스레드보다 스레드에서 수행하지 않으면 사용자가 비정상적으로 오래 기다립니다.

를 덤프하여 하세요.AsyncTask.

또는 필요할 때 새 스레드를 만듭니다.

작업 작업 큐에서 동작합니다).LinkedBlockingQueue★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」

아니요, 스레드를 다시 시작할 수 없습니다. 다시 시작하면 실행 시간이 느려집니다.예외 java.lang.Inlogal Thread State Exception(불량 스레드 스테이트 예외).>

그 이유는 스레드에 의해 run() 메서드가 실행되면 데드 상태가 되기 때문입니다.

예를 들어 스레드를 다시 시작하고 그 스레드에서 start() 메서드를 호출하는 것(내부적으로는 run() 메서드를 호출함)을 생각하는 것은 데드맨에게 깨어나 실행을 요구하는 것과 같습니다.생을 마치면 사람이 죽은 상태가 된다.

public class MyClass implements Runnable{

    @Override
    public void run() {
           System.out.println("in run() method, method completed.");
    }

    public static void main(String[] args) {
                  MyClass obj=new MyClass();            
        Thread thread1=new Thread(obj,"Thread-1");
        thread1.start();
        thread1.start(); //will throw java.lang.IllegalThreadStateException at runtime
    }

}

/*OUTPUT in run() 메서드, 메서드 완료.스레드 "main" java.lang에 예외가 있습니다.java.lang의 Illegal Thread State Exception입니다.Thread.start(알 수 없는 소스) */

이것을 확인하다

실행 가능 파일을 작성하고 실행 가능 파일을 실행할 때마다 새 스레드로 래핑해야 합니다.정말 보기 흉하지만 스레드를 다른 스레드로 래핑하여 코드를 다시 실행할 수 있지만 이 작업만 수행하면 됩니다.

말씀하신 대로 스레드는 한 번 이상 시작할 수 없습니다.

소식통에서 직접 : Java API 사양

스레드를 한 번 이상 시작하는 것은 결코 합법적이지 않습니다.특히 스레드는 실행이 완료된 후에는 재시작되지 않을 수 있습니다.

스레드에서 진행 중인 작업을 다시 실행해야 할 경우 새 스레드를 만들고 실행해야 합니다.

스레드를 재사용하는 것은 Java API에서 잘못된 작업입니다.그러나 실행 가능한 구현으로 압축하여 해당 인스턴스를 다시 실행할 수 있습니다.

예, 이미 스레드 실행을 시작할 수 없습니다.Illigal(불법)을 던집니다.실행 시 ThreadStateException - 스레드가 이미 시작된 경우.

스레드를 정말로 시작해야 하는 경우:옵션 1) 스레드를 여러 번 실행해야 할 경우 스레드의 새 인스턴스를 만들고 해당 스레드에서 호출을 시작해야 합니다.

스레드는 한 번만 시작할 수 있습니까?

네, 딱 한 번 시작하면 돼요.

이 경우 스레드를 다시 실행하려면 어떻게 해야 합니까?이 특정 스레드는 백그라운드에서 계산을 수행하는데, UI 스레드보다 스레드에서 수행하지 않으면 사용자가 비정상적으로 오래 기다립니다.

실행하지 마세요.Thread대신 Runnable을 생성하여 핸들러에 올립니다.스레드. 여러 개를 제출할 수 있습니다.Runnable물건들.데이터를 UI 스레드로 다시 전송하려면Runnable run()메서드, 투고 aMessageHandlerUI 스레드 및 프로세스handleMessage

코드 예에 대해서는, 다음의 투고를 참조해 주세요.

안드로이드:실로 굽다.

정말 보기 흉하지만 스레드를 다른 스레드로 래핑하여 코드를 다시 실행할 수 있지만 이 작업만 수행하면 됩니다.

스레드를 작성한 프로그래머에 의해 발생한 리소스 누수를 수정해야 했지만, 스레드를 시작하는 대신 직접 run()-method를 호출했습니다.그러니까 정말 어떤 부작용을 일으키는지 모르는 한 피하세요.

이것이 좋은 방법인지는 모르겠지만 run() 메서드 내에서 run()을 호출하면 오류가 발생하지 않고 실제로 내가 원하는 대로 실행됩니다.

다시 실타래가 시작되진 않겠지만, 아마 이게 당신에게 도움이 될 거예요.

public void run() {

    LifeCycleComponent lifeCycleComponent = new LifeCycleComponent();

    try {
        NetworkState firstState = lifeCycleComponent.getCurrentNetworkState();
        Thread.sleep(5000);
        if (firstState != lifeCycleComponent.getCurrentNetworkState()) {
            System.out.println("{There was a NetworkState change!}");
            run();
        } else {
            run();
        }
    } catch (SocketException | InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    Thread checkingNetworkStates = new Thread(new LifeCycleComponent());
    checkingNetworkStates.start();
}

이게 조금이라도 도움이 됐으면 좋겠어요.

건배.

언급URL : https://stackoverflow.com/questions/1215548/is-it-legal-to-call-the-start-method-twice-on-the-same-thread

반응형