Runnable 인터페이스의 하위 클래스 객체를 Thread 생성자에 전달하는 이유는 무엇입니까?
巴扎黑2017-06-12 09:19:22
0
3
1577
그리고 스레드와 비교했을 때 상속과는 별개로 코드와 데이터의 독립성은 실행 가능 파일에 어떻게 반영되나요? 일부 블로그에 쓰인 것처럼 스레드는 리소스를 공유할 수 없지만, runnable은 리소스를 공유할 수 있습니다. 스레드의 변수를 정적으로 변경하면 충분하지 않나요? 다음 글처럼 http://blog.csdn.net/uudou/ar...
Thread와 Runnable을 분리하는 이유는 스레드의 "생성 프로세스"와 스레드의 "실행 로직"을 완전히 분리하기 위해서입니다.
즉, 스레드 생성 프로세스는 "코드"입니다. 스레드의 실행 논리는 "데이터"입니다.
좀 혼란스럽게 들리는데, 전부 JAVA 코드 아닌가요? 코드는 왜 다시 데이터가 되나요?
우리는 이러한 개념에 얽매이지 않습니다. 이 문제를 거꾸로 생각하고 문제를 설명하는 예를 들 수 있다고 생각합니다.
토론 과정:
예를 들어, 저는 단일 스레드 프로그램을 설계하고 싶습니다. 이 단일 스레드는 두 가지 작업을 완료해야 합니다.
1. hello world 문장을 인쇄합니다.
2. 두 숫자 int a와 int b의 합을 계산합니다.
참고: 실행 1이란 무엇인가요? 아니면 2개? 매개변수 n에 의해 결정되며, n은 임의의 숫자입니다...
이 두 작업을 동일한 스레드에서 실행하려면 다음과 같은 코드를 작성할 수 있습니다.
으아아아
위 코드는 실제로 작업을 완료할 수 있지만 문제는 스레드의 "생성 프로세스"와 "비즈니스 로직"을 혼동한다는 것입니다...
이건 좋지 않습니다. 그런데 운영 체제 수준에서 스레드 생성 프로세스는 실제로 매우 복잡합니다!
Java 언어는 이러한 복잡성을 눈에 띄지 않게 캡슐화합니다. 코드는 단지 Thread 클래스이고 이를 호출할 수 있는 임계값이 없는 것처럼 보이지만 Thread의 생성 프로세스는 여전히 매우 복잡하고 리소스를 소비합니다.
비즈니스로 돌아가서 이제 이전 1과 2 외에 시스템의 현재 타임스탬프를 표시하기 위해 3도 추가합니다.
그래서 작업은 다음과 같습니다.
1. hello world 문장을 인쇄합니다.
2. 두 숫자의 합을 계산하고 3.
이번에는 Thread 생성 프로세스를 수정해야 합니다. 즉, 시작 기능을 수정해야 합니다.
으아아아
이 토론은 끝났습니다. 주의 깊게 관찰해 보겠습니다...실제 내용:
으아아아
코드의 이 부분은 변경되지 않고 그대로 유지되며 필요에 따라 시작 기능의 코드만 수정됩니다.
그럼 변경된 내용 중 이 부분을 인터페이스로 패키징할 수 있을까요? ?
좋은 생각이군요!
으아아아
이제 잘 이해 되셨는지 모르겠네요? :D
하하, Java의 Thread 클래스는 Runnable 매개변수가 있는 생성자만 제공하지 않나요?
비즈니스 코드를 Runnable 인터페이스의 구현 클래스에 넣었습니다.
으아아아
마지막으로 다음과 같이 부를 수 있습니다.
으아아아
이로써 스레드의 "생성 프로세스"와 "비즈니스 로직"의 완전한 분리가 완료됩니다! 이러한 "분할"은 또한 Java 스레드 풀 기술의 기반을 마련했습니다.
솔직히 샘플 코드의 Thread t = new Thread() { ... } 는 충분히 간단하지만, 스레드 풀에 Thread를 생성하는 것은 그리 간단하지 않습니다.
그래서 "분할"이 꼭 필요해요!
또한 상상해 보세요:
으아아아
Runable 구현 클래스에 Runnable 목록이 포함되어 있으면 어떻게 되나요?
요약:
1. Runnable 인터페이스를 사용하는 목적은 스레드의 "실행 논리"에서 스레드의 "생성 프로세스"를 완전히 분리하는 것입니다. 2. 스레드는 리소스를 공유할 수 있지만 이 설명은 올바르지 않습니다. ; 3. 토론 중에 우리는 구체적인 내용을 추상화했습니다. 4. 제가 제시한 코드는 비교적 간단하지만 문제를 설명할 수 있기를 바랍니다.
데이터와는 별로 관련이 없는 것 같습니다. Runnable에는 두 가지 이점이 있다고 생각합니다.
Runnable을 구현한 후 실행할 스레드를 열 수 있습니다(보통
executorService.exec(command)
,挫一点也可以用new Thread(command).start()
),也可以不开线程阻塞式的跑(直接调用command.run()
사용).Runnable
的好处是各种场景都可以用,比如你可以让任何一个Class implements Runnable
,但是extends Thread
Java 단일 상속으로 인해 일부 시나리오에서는 사용할 수 없습니다.답변:
이 문제는 디자인 문제로 간주됩니다.
Thread와 Runnable을 분리하는 이유는 스레드의 "생성 프로세스"와 스레드의 "실행 로직"을 완전히 분리하기 위해서입니다.
즉,
좀 혼란스럽게 들리는데, 전부 JAVA 코드 아닌가요? 코드는 왜 다시 데이터가 되나요?스레드 생성 프로세스는 "코드"입니다.
스레드의 실행 논리는 "데이터"입니다.
2. 두 숫자 int a와 int b의 합을 계산합니다.
참고: 실행 1이란 무엇인가요? 아니면 2개? 매개변수 n에 의해 결정되며, n은 임의의 숫자입니다...
이 두 작업을 동일한 스레드에서 실행하려면 다음과 같은 코드를 작성할 수 있습니다.
으아아아위 코드는 실제로 작업을 완료할 수 있지만 문제는 스레드의 "생성 프로세스"와 "비즈니스 로직"을 혼동한다는 것입니다...
이건 좋지 않습니다. 그런데 운영 체제 수준에서 스레드 생성 프로세스는 실제로 매우 복잡합니다!
Java 언어는 이러한 복잡성을 눈에 띄지 않게 캡슐화합니다. 코드는 단지 Thread 클래스이고 이를 호출할 수 있는 임계값이 없는 것처럼 보이지만 Thread의 생성 프로세스는 여전히 매우 복잡하고 리소스를 소비합니다.
비즈니스로 돌아가서 이제 이전 1과 2 외에 시스템의 현재 타임스탬프를 표시하기 위해 3도 추가합니다.
그래서 작업은 다음과 같습니다.
1. hello world 문장을 인쇄합니다.2. 두 숫자의 합을 계산하고
이 토론은 끝났습니다. 주의 깊게 관찰해 보겠습니다...실제 내용:3.
이번에는 Thread 생성 프로세스를 수정해야 합니다. 즉, 시작 기능을 수정해야 합니다.
으아아아
으아아아
코드의 이 부분은 변경되지 않고 그대로 유지되며 필요에 따라 시작 기능의 코드만 수정됩니다.으아아아
이제 잘 이해 되셨는지 모르겠네요? :D으아아아
마지막으로 다음과 같이 부를 수 있습니다.으아아아
이로써 스레드의 "생성 프로세스"와 "비즈니스 로직"의 완전한 분리가 완료됩니다! 이러한 "분할"은 또한 Java 스레드 풀 기술의 기반을 마련했습니다.으아아아
Runable 구현 클래스에 Runnable 목록이 포함되어 있으면 어떻게 되나요?요약:
1. Runnable 인터페이스를 사용하는 목적은 스레드의 "실행 논리"에서 스레드의 "생성 프로세스"를 완전히 분리하는 것입니다.
알겠습니다. 위 내용은 이 질문에 대한 제 답변입니다. 도움이 되셨으면 좋겠습니다.2. 스레드는 리소스를 공유할 수 있지만 이 설명은 올바르지 않습니다. ;
3. 토론 중에 우리는 구체적인 내용을 추상화했습니다.
4. 제가 제시한 코드는 비교적 간단하지만 문제를 설명할 수 있기를 바랍니다.