같은 스레드에서 시작 메서드를 두 번 호출하는 것이 합법입니까?
는 '하다, 하다, '로 이어집니다.java.lang.IllegalThreadStateException: Thread already started
가 했을 때start()
프로그램에서 두 번째로 메서드를 사용합니다.
updateUI.join();
if (!updateUI.isAlive())
updateUI.start();
이것은 두 번째에 일어난다.updateUI.start()
이렇게 여러 번 나서 다시 한 번 밟아봤는데요.updateUI.start()
.
" "updateUI.run()
에러는 회피하지만, 스레드는 UI 스레드(SO의 다른 투고에 기재되어 있는 콜링 스레드)로 동작합니다.을 사용법
스레드는 한 번만 시작할 수 있습니까?이 경우 스레드를 다시 실행하려면 어떻게 해야 합니까?이 특정 스레드는 백그라운드에서 계산을 수행하는데, UI 스레드보다 스레드에서 수행하지 않으면 사용자가 비정상적으로 오래 기다립니다.
스레드를 한 번 이상 시작하는 것은 결코 합법적이지 않습니다.특히 스레드는 실행이 완료된 후에는 재시작되지 않을 수 있습니다.
더 나아가:
★★★★★★★★★★★:
IllegalThreadStateException
- 스레드가 이미 시작된 경우.
네, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,Thread
아, 네, 네, 네, 네.
이 경우 스레드를 다시 실행하려면 어떻게 해야 합니까?
「」의 'Thread
번 새로운 .그러면 새로운 인스턴스를 작성해야 합니다.Thread
를 호출합니다.start
위에.
정확히 맞아.매뉴얼에서 다음 항목을 참조하십시오.
스레드를 한 번 이상 시작하는 것은 결코 합법적이지 않습니다.특히 스레드는 실행이 완료된 후에는 재시작되지 않을 수 있습니다.
반복적인 연산에 대해 Swing Utilities invoke Later 메서드를 사용할 수 있는 것 같습니다.이미 통화 실험을 하고 있습니다.run()
직접적으로', ' '아', '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,Runnable
Thread
을.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()
메서드, 투고 aMessage
에Handler
UI 스레드 및 프로세스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
'programing' 카테고리의 다른 글
집계된 값이 있는 요약 행을 표시하는 mariadb SQL 쿼리 (0) | 2022.09.28 |
---|---|
Vuex TypeScript에서 문자열이 업데이트되지 않지만 어레이가 업데이트됨 (0) | 2022.09.28 |
존재하지 않는 참조를 사용하여 MariaDB에 데이터 저장 (0) | 2022.09.28 |
Python의 "property"와 "attribute"의 차이점은 무엇입니까? (0) | 2022.09.28 |
VueJS 동적 속성 이름이 값을 업데이트하지 않음 (0) | 2022.09.28 |