Java 다중 스레드 인스턴스 상세 정보 (2)
사.Java 다중 스레드의 차단 상태와 스레드 제어
위에서 언급한 Java 장애의 몇 가지 구체적인 유형은다음은 Java 스레드가 막히는 주요 방법입니다.
1.join()
join - 한 라인이 다른 라인이 완성되기를 기다려야만 계속 실행할 수 있습니다.만약에 A 라인 실행체에서 B 라인의join () 방법을 호출하면 A 라인이 막히고 B 라인이 실행될 때까지 A가 계속 실행될 수 있음을 알 수 있다.
public class ThreadTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
thread.start();
try {
thread.join(); // main thread
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
2.sleep()sleep - 현재 실행 중인 라인을 지정한 시간을 멈추고 막힌 상태로 들어갑니다.수면 시간 내에 이 라인은 준비 상태가 아니기 때문에 실행할 기회를 얻지 못한다.이 때 시스템에 실행 가능한 라인이 없더라도sleep () 의 라인은 실행되지 않습니다.따라서sleep () 방법은 라인 실행을 멈추는 데 자주 사용됩니다.
앞에서 말한 바와 같이 새 라인의 start () 방법을 호출한 후에 라인이 준비 상태로 들어가면 다음 시간에 CPU 타임 슬라이드가 실행될 수 있습니다. 이 새로운 라인의 필연적인 즉각 실행을 원한다면 원래 라인의 sleep (1) 를 직접 호출하면 됩니다.
public class ThreadTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
thread.start();
try {
Thread.sleep(1); // thread
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
주: CPU가 비어 있지 않기 때문에 새 라인으로 전환됩니다.3. 백그라운드 스레드(Daemon Thread)
개념/목적: 백그라운드 라인은 주로 다른 라인(상대적으로 프런트 라인이라고 할 수 있음)에 서비스를 제공하거나'수호 라인'이다.JVM의 쓰레기 수거 라인과 같습니다.
생명주기: 백그라운드 라인의 생명주기는 프론트 라인의 생명주기와 일정한 관련이 있다.주로 다음과 같다. 모든 프론트 라인이 사망 상태에 들어갈 때 프론트 라인은 자동으로 죽는다. (사실 이것도 이해하기 쉽다. 왜냐하면 프론트 라인이 존재하는 목적은 프론트 라인을 위해 서비스하는 것이기 때문이다. 모든 프론트 라인이 죽었으니 그 자체가 남겨두면 무슨 소용이 있겠는가... 위대하다!).
백그라운드 스레드 설정:Thread 대상의 setDaemon(true) 방법을 호출하면 지정한 스레드를 백그라운드 스레드로 설정할 수 있습니다.
public class ThreadTest {
public static void main(String[] args) {
Thread myThread = new MyThread();
for (int i = 0; i < 100; i++) {
System.out.println("main thread i = " + i);
if (i == 20) {
myThread.setDaemon(true);
myThread.start();
}
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
스레드가 백그라운드 스레드인지 판단:thread 대상의 isDeamon () 방법을 호출합니다.주:main 라인은 기본적으로 프론트 라인이고, 프론트 라인 창설에서 만든 하위 라인은 기본적으로 프론트 라인이며, 프론트 라인에서 만든 라인은 기본적으로 프론트 라인입니다.setDeamon(true) 방법을 호출하여 프론트 라인을 백엔드 라인으로 설정할 때 start() 방법을 호출하기 전에 해야 합니다.그저께 라인이 모두 사망한 후, JVM은 백그라운드 라인이 사망했다고 통지하였으나, 지령을 받고 응답하기까지 일정한 시간이 소요되었다.
4. 스레드의 우선 순위/SetPriority 변경():
모든 스레드는 실행할 때 일정한 우선순위를 가지고 우선순위가 높은 스레드는 비교적 많은 실행 기회를 가진다.모든 스레드의 기본 우선 순위는 생성된 스레드의 우선 순위와 같습니다.main 루틴은 기본적으로 일반적인 우선순위를 가지고 있습니다.
스레드 우선 순위 설정: setPriority(int priorityLevel).매개변수 priority Level 범위는 1-10 사이이며 다음과 같은 세 가지 정적 상수 값을 사용합니다.
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
스레드 우선 순위 가져오기: getPriority ()
주: 비교적 높은 스레드 우선순위를 가진 스레드 대상은 이 스레드가 우선순위가 아니라 비교적 많은 실행 기회를 가지고 있음을 나타낸다.
public class ThreadTest {
public static void main(String[] args) {
Thread myThread = new MyThread();
for (int i = 0; i < 100; i++) {
System.out.println("main thread i = " + i);
if (i == 20) {
myThread.setPriority(Thread.MAX_PRIORITY);
myThread.start();
}
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
}
}
5. 스레드 양보: yield ()이전 블로그에서 yield()의 기본적인 역할을 설명했고 yield() 방법은 루트 우선순위와 관련이 있다. 어떤 루트가 yiled() 방법을 실행 상태에서 준비 상태로 바꾸면 CPU는 준비 상태 루트 대기열에서 이 루트 우선순위와 같거나 우선순위가 높은 루트만 선택하여 실행한다.
public class ThreadTest {
public static void main(String[] args) {
Thread myThread1 = new MyThread1();
Thread myThread2 = new MyThread2();
myThread1.setPriority(Thread.MAX_PRIORITY);
myThread2.setPriority(Thread.MIN_PRIORITY);
for (int i = 0; i < 100; i++) {
System.out.println("main thread i = " + i);
if (i == 20) {
myThread1.start();
myThread2.start();
Thread.yield();
}
}
}
}
class MyThread1 extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("myThread 1 -- i = " + i);
}
}
}
class MyThread2 extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("myThread 2 -- i = " + i);
}
}
}
시리즈:j ava 다중 루틴 실례 설명 (1)
Java 다중 스레드 인스턴스 상세 정보 (2)
Java 멀티스레드 인스턴스 상세(3)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.