2

나는 두통을 일으키는 동시성에 대해 조금 읽었다.EDT에서 main으로 작업을 보내시겠습니까?

은 당신이 사용하는 메인 스레드에서 EDT에서 실행할 작업을 설정할 수 있습니다 이해 :

SwingUtilities.invokeLater 

을하지만 당신은 EDT에서 주 스레드에서 실행하는 작업을 설정할 수 있습니까? 마찬가지로

은 :

Thread mymainthread=Thread.currentThread();//<referring to the thread that initially kicks off public static void main 

public void mousePressed(MouseEvent e){ //queue a task to run on mymainthread } 

은 수행 할 수 있습니다

? 나쁜 생각입니까?

(here)와 비슷한 다른 질문은 새로운 스레드를 만드는 것에 대해 이야기하지만 단일 스레드 (+ EDT) 응용 프로그램을 목표로한다면 기본을 계속 사용하는 것이 더 안전하고 간단하지 않습니까? ....... 또는 어쩌면 내가이 모든 잘못 됐어.

EDIT : 설명해야 할 사항 : 주 스레드 (느린 루프에서 실행 중)에서 서로 통신 할 개체를 만들고 싶었 기 때문에 다른 스레드에서 인스턴스화하지 않기를 원했습니다. edt 또는 기타.

+0

왜 그렇게하고 싶습니까? 귀하의 요청 뒤에 동기 부여에 대해 더 자세히 말씀해 주시겠습니까? 나는이 모든 것을 잘못 알고 있다고 생각합니다. :-) 배경 스레드를 만들 때 수백 가지를 생성하지 않는 한 아무 문제가 없습니다. 그 시나리오에 대해 걱정이된다면, 어떤 종류의 ThreadPool을 사용하십시오. –

+0

@HovercraftFullOfEels 내 질문에 공통적 인 문제인 것으로 보입니다. 서로 자주 의사 소통하는 객체를 만드는 경우 모두 동일한 스레드에서 만들어 지는지 확인하는 것이 현명하지 않다고 생각했습니다. – Nikki

+1

Nikki : 아니요. 아마도 통신이 스레드로부터 안전한 방식으로 수행되도록 노력하는 것이 좋습니다. –

답변

5

하지만 EDT의 주 스레드에서 실행할 작업을 설정할 수 있습니까?

나는 EDT가 무엇인지 혼란 스럽다고 생각합니다. 스윙과 다른 많은 프레임 워크는 thread-confinement라는 기술을 사용합니다.
스레드 안전성을 보장하기 위해 모든 작업이 단일 스레드에서 실행됩니다. Swing의이 스레드를 Event Dispatcher Thread라고합니다.
이 스레드는 대기열을 가지고 있으며 같은 스레드에서 한 번에 하나씩 큐의 모든 작업을 실행합니다. 따라서 UI를 차단하지 않도록 작업을 줄여야합니다.
그래서 EDT를 사용할 때 본질적으로 작업을 스레드의 큐로 전달하면 EDT가 결국이를 실행하게됩니다.
할 수있는 일은 별도의 스레드에서 실행될 스레드를 생성하는 EDT 큐에 작업을 넣는 것입니다. 배경 스레드로 어떤 이유로 현재 스레드를 사용하고 싶다면 아마도 그렇게 할 수 있을까요? 가장 간단한 방법은 runnable을 제출하여 일부 백그라운드 스레드의 일부로 실행하는 것입니다. 풀의 부분

+0

@HovercraftFullOfEels : 업데이트 된 답변 – Cratylus

+0

+1 EDT 설명과 비슷합니다. –

2

스레드 제한을 수행하기 위해 자체 이벤트 루프를 만들 수 있습니다. 이렇게하면 EDT처럼 동작하는 별도의 단일 스레드가 허용됩니다. 두 스레드 사이에서 동시에 변경 가능한 객체를 동시에 공유하지 않도록주의하십시오.

구현은 BlockingQueuewhile 루프처럼 간단 할 수 있습니다. ExecutorServicejava.util.concurrent.Executors.newFixeThreadPool(1)에서 약간 높일 수 있습니다.