이 스레드 조인 코드는 무엇을 의미합니까?
이 코드에서는 2개의 결합과 브레이크는 무엇을 의미합니까? t1.join()
이 되다t2
t1
★★★★★★★★★★★★★★★★★?
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join();
t2.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
이 스레드 조인 코드는 무엇을 의미합니까?
javadocs 메서드에서 인용하려면:
join()
을 사용하다
샘플 코드를 실행하고 있는 스레드가 있는데, 아마도 메인 스레드일 것입니다.
- " " " 가 되어 시작됩니다.
t1
★★★★★★★★★★★★★★★★★」t2
로 동작하기 시작합니다.두 스레드가 병렬로 실행되기 시작합니다. - 가 " " 를 호출합니다.
t1.join()
t1
스레드 투 피니쉬 t1
되어 「」가 됩니다.t1.join()
방법:t1
그 전에 이미 끝났을 수도 있다join()
경우 됩니다.join()
콜이 즉시 반환됩니다.- 가 " " 를 호출합니다.
t2.join()
t2
스레드 투 피니쉬 t2
완료 완료 전에 이 있습니다)t1
did)및 "the scread" ("traud did")t2.join()
방법
은 '이해할 수 없다'는 을 이해하는 것입니다.t1
★★★★★★★★★★★★★★★★★」t2
스레드는 병렬로 실행되어 왔지만 스레드를 시작한 메인 스레드는 스레드가 완료될 때까지 기다려야 계속할 수 있습니다.그건 흔한 패턴이에요.또한.t1
"/"/"t2
메인 스레드가 호출되기 전에 완료되었을 수 있습니다.join()
그 위에 올려놔요. ★★★★★★★★★★★★★★★★」join()
하다
t1.join()
종료될 시키는 것을 합니다.t1은 t2를 정지시킵니다.
아니요. 호출하는 메인 스레드t1.join()
않고 .t1
그드그t2
되며, 이 경우 영향을 .t1
★★★t1.join()
아예 전화하지 마.
는 '/'/'/'/「」입니다.join()
InterruptedException
, 「」를 join()
다른 스레드에 의해 그 자체가 중단될 수 있습니다.
while (true) {
" "에 되어 있다.while
패턴입니다.loop은 이상한 패턴입니다. 첫 두 Join을 합니다.InterruptedException
각 경우에 적절하게.루프를 만들 필요가 없습니다.
이것은 Java 인터뷰에 관한 자주 묻는 질문입니다.
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread e2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join(); // 1
t2.join(); // 2 These lines (1,2) are in in public static void main
break;
}
}
t1.join()
t1이 '먼저 끝내고 싶다' 이런 거 있잖아요의 경우도 마찬가지다.t2
시작했든t1
★★★★★★★★★★★★★★★★★」t2
는 「」(「」)main
은t1
★★★★★★★★★★★★★★★★★」t2
을을끝끝끝끝끝
유의해야 할 점, 「 」입니다.t1
★★★★★★★★★★★★★★★★★」t2
접속 콜 시퀀스에 관계없이 병렬로 실행할 수 있습니다.t1
★★★★★★★★★★★★★★★★★」t2
바로 그입니다.main/daemon
기다려야 하는 스레드
join()
스레드가 완료될 때까지 기다리는 것을 의미합니다.이것은 블로커 방식입니다.스레드(「메인 스레드」를 )join()
을(를) .t1.join()
로 t1
하고, 그에 이 합니다.t2.join()
.
천 마디 말보다 한 번 보는 게 더 낫다.
Main thread-->----->--->-->--block##########continue--->---->
\ | |
sub thread start()\ | join() |
\ | |
---sub thread----->--->--->--finish
도움이 되기를 바랍니다. 자세한 내용은 여기를 클릭하십시오.
스레드 tA가 tB.join()을 호출하면 tB가 정지되거나 tA가 중단될 때까지 대기할 뿐만 아니라 tB의 마지막 문과 tA 스레드의 tB.join() 이후의 다음 문 사이에 opens-before 관계가 생성됩니다.
프로그램을 의미합니다.
class App {
// shared, not synchronized variable = bad practice
static int sharedVar = 0;
public static void main(String[] args) throws Exception {
Thread threadB = new Thread(() -> {sharedVar = 1;});
threadB.start();
threadB.join();
while (true)
System.out.print(sharedVar);
}
}
항상 인쇄
>> 1111111111111111111111111 ...
하지만 프로그램
class App {
// shared, not synchronized variable = bad practice
static int sharedVar = 0;
public static void main(String[] args) throws Exception {
Thread threadB = new Thread(() -> {sharedVar = 1;});
threadB.start();
// threadB.join(); COMMENT JOIN
while (true)
System.out.print(sharedVar);
}
}
인쇄뿐만 아니라
>> 0000000000 ... 000000111111111111111111111111 ...
그렇지만
>> 00000000000000000000000000000000000000000000 ...
항상 '0'만.
Java 메모리 모델에서는 헤펜스 이전 관계(스레드 시작, 스레드 조인, synchonized 키워드 사용, AtomicXX 변수 사용 등) 없이 스레드 B에서 메인 스레드로 "sharedVar"의 새로운 값을 "전송"할 필요가 없기 때문입니다.
말하면: ★★★★★★★★★★★★★★★★★★★★★★:
t1.join()
returns t1
료했습습니니다
은 실타래가 t1
만,, 립종립종 립립 립립 립립
코드 뒤에 오는 입니다.t1.join()
다음 시간 이후에만 실행됩니다.t1.join()
아온온다
Join의 Oracle 설명서 페이지에서
join
스레드가다른 수 .
이 t1인 Thread
있는 .
t1.join() : causes the current thread to pause execution until t1's thread terminates.
t2인 a' 입니다.Thread
있는 .
t2.join(); causes the current thread to pause execution until t2's thread terminates.
join
API Java API api apiAPI 。(특히 jdk 1.5 릴리즈에서는) 일정 기간 동안 동시성 측면에서 많은 것이 변경되었습니다.
java.util.concurrent API에서도 같은 것을 실현할 수 있습니다.몇 가지 예는 다음과 같습니다.
- invokeAll을 사용하는 경우
ExecutorService
- Count Down Latch 사용
- ForkJoinPool 또는 newWorkStealingPool 사용:
Executors
부터)(Java 8부터)
관련 SE 질문을 참조하십시오.
모든 스레드의 작업이 Java로 완료될 때까지 기다리다
Join()의 동작은 항상 혼란스러웠습니다.누가 누구를 기다릴지 기억하려고 했기 때문입니다.그런 식으로 기억하려고 하지 마세요.
기본적으로는 순수 wait() 및 notify() 메커니즘입니다.
모든 오브젝트(t1)에서 wait()를 호출하면 호출 오브젝트(메인)가 대기실(블록 상태)로 전송되는 것을 알고 있습니다.
여기서 메인 스레드는 커버 아래의 wait()인 join()을 호출합니다.따라서 메인 스레드는 알림을 받을 때까지 기다립니다.t1은 실행(스레드 완료)이 완료되면 알림을 보냅니다.
알림 수신 후 메인 대기실에서 나와 실행을 진행합니다.
도움이 됐으면 좋겠다!
package join;
public class ThreadJoinApp {
Thread th = new Thread("Thread 1") {
public void run() {
System.out.println("Current thread execution - " + Thread.currentThread().getName());
for (int i = 0; i < 10; i++) {
System.out.println("Current thread execution - " + Thread.currentThread().getName() + " at index - " + i);
}
}
};
Thread th2 = new Thread("Thread 2") {
public void run() {
System.out.println("Current thread execution - " + Thread.currentThread().getName());
//Thread 2 waits until the thread 1 successfully completes.
try {
th.join();
} catch( InterruptedException ex) {
System.out.println("Exception has been caught");
}
for (int i = 0; i < 10; i++) {
System.out.println("Current thread execution - " + Thread.currentThread().getName() + " at index - " + i);
}
}
};
public static void main(String[] args) {
ThreadJoinApp threadJoinApp = new ThreadJoinApp();
threadJoinApp.th.start();
threadJoinApp.th2.start();
}
//Happy coding -- Parthasarathy S
}
join() 메서드는 지정된 스레드가 데드(완료) 상태가 될 때까지 현재 실행 중인 스레드의 실행을 보류하기 위해 사용됩니다.
왜 join() 메서드를 사용하는가?
통상적인 상황에서는 스레드 스케줄러가 스레드를 여러 개 스케줄 하기 때문에 스레드 실행 순서가 보장되지 않습니다.
예를 들어 새 프로젝트를 만들고 다음 코드를 복사해 보겠습니다.
activity_main.xml 코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_without_join"
app:layout_constraintTop_toTopOf="parent"
android:text="Start Threads Without Join"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_with_join"
app:layout_constraintTop_toBottomOf="@id/btn_without_join"
android:text="Start Threads With Join"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv"
app:layout_constraintTop_toBottomOf="@id/btn_with_join"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java 코드입니다.
public class MainActivity extends AppCompatActivity {
TextView tv;
volatile String threadName = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
Button btn_without_join = findViewById(R.id.btn_without_join);
btn_without_join.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
withoutJoin();
}
});
Button btn_with_join = findViewById(R.id.btn_with_join);
btn_with_join.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
withJoin();
}
});
}
private void withoutJoin()
{
tv.setText("");
Thread th1 = new Thread(new MyClass2(), "th1");
Thread th2 = new Thread(new MyClass2(), "th2");
Thread th3 = new Thread(new MyClass2(), "th3");
th1.start();
th2.start();
th3.start();
}
private void withJoin()
{
tv.setText("");
Thread th1 = new Thread(new MyClass2(), "th1");
Thread th2 = new Thread(new MyClass2(), "th2");
Thread th3 = new Thread(new MyClass2(), "th3");
th1.start();
try {
th1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
th2.start();
try {
th2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
th3.start();
}
class MyClass2 implements Runnable{
@Override
public void run() {
Thread t = Thread.currentThread();
runOnUiThread(new Runnable() {
public void run() {
tv.setText(tv.getText().toString()+"\n"+"Thread started: "+t.getName());
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
tv.setText(tv.getText().toString()+"\n"+"Thread ended: "+t.getName());
}
});
}
}
}
첫 번째 버튼(Start Threads Without Join)을 누르면 다음과 같은 결과가 나타납니다.
두 번째 버튼(Start Threads With Join)을 누르면 다음과 같은 결과가 나타납니다.
주 스레드가 스레드 t1과 t2를 시작한다고 가정해 보겠습니다.여기서 t1.join()이 호출되면 메인스레드는 스레드 t1이 정지될 때까지 정지된 후 재개됩니다.마찬가지로 t2.join()이 실행되면 메인스레드는 스레드 t2가 정지된 후 재개될 때까지 다시 중단됩니다.
자, 이렇게 하는군요.
또한, while loop은 실제로 여기서 필요하지 않습니다.
언급URL : https://stackoverflow.com/questions/15956231/what-does-this-thread-join-code-mean
'programing' 카테고리의 다른 글
v-for 루프 내에서 v-model 사용 (0) | 2022.07.16 |
---|---|
Vue.js - 요소 UI - MessageBox의 HTML 메시지 (0) | 2022.07.16 |
Vue 계산 세터가 확인란과 함께 작동하지 않습니까? (0) | 2022.07.16 |
Java VM은 몇 개의 스레드를 지원할 수 있습니까? (0) | 2022.07.16 |
vue 2의 컴포넌트 없이 vue-router를 사용할 수 있습니까? (0) | 2022.07.16 |