초보 장면 자바 스 레 드 관련 문제 및 해결 방안
a.스 레 드 클래스(new Thread)를 계승 하고 run 방법 을 다시 씁 니 다.
public class MyThread extends Thread{// Thread
public void run(){
// run
}
}
public class Main {
public static void main(String[] args){
new MyThread().start();//
}
}
b.runnable 인 터 페 이 스 를 실현 하고 runnable 대상 을 Thread 클래스 에 전송 합 니 다.
public class MyThread2 implements Runnable {// Runnable
public void run(){
// run
}
}
public class Main {
public static void main(String[] args){
//
MyThread2 myThread=new MyThread2();
Thread thread=new Thread(myThread);
thread().start();
// new Thread(new MyThread2()).start();
}
}
c.스 레 드 풀 방식 으로 runnable 또는 callable 작업 을 제출 합 니 다.
public class Main {
public static void main(String[] args){
MyThread3 th=new MyThread3();
// Lambda Callable
// FutureTask Callable
FutureTask<Integer> future=new FutureTask<Integer>(
(Callable<Integer>)()->{
return 5;
}
);
new Thread(task," ").start();// Callable
try{
System.out.println(" :"+future.get());//get() ,
}catch(Exception e){
ex.printStackTrace();
}
}
}
d.세 번 째 방식 을 추천 합 니 다.효율 적 이 고 자원 을 제어 할 수 있다.2.무엇이 스 레 드 동기 화 입 니까?스 레 드 동기 화 는 언제 사용 합 니까?
1)스 레 드 동기 화 는 무엇 입 니까?
즉,하나의 스 레 드 가 메모 리 를 조작 할 때 다른 스 레 드 는 이 메모리 주 소 를 조작 할 수 없습니다.이 스 레 드 가 완 료 될 때 까지 다른 스 레 드 는 이 메모리 주 소 를 조작 할 수 있 고 다른 스 레 드 는 대기 상태 에 있 습 니 다.
2)스 레 드 는 언제 사용 합 니까?
쉽게 말 하면 동기 화 는 여러 스 레 드 가 같은 대상 에 접근 하 는 것 을 방지 하고 데이터 가 안전 하지 않 습 니 다.스 레 드 의 동기 화 는 안전 을 의미 합 니 다.예 를 들 어 당신 이 돈 을 찾 으 러 가 는 경우,당신 의 집행 문 구 는 내 가 사용 하 는 것 과 같은 대상 이 라면,당신 은 카드 에서 공제 한 금액 과 은행 카드 안에 이렇게 많은 돈 이 있어 야 공제 할 수 있 습 니 다.
3.스 레 드 안전 이 무엇 입 니까?
1)스 레 드 안전 이란 여러 스 레 드 가 동시에 실 행 된 상황 에서 결 과 는 항상 단일 스 레 드 가 실 행 된 결과 와 일치 하고 논리 적 으로 오류 가 발생 하지 않 습 니 다.
2)어떤 상황 에서 라인 안전 문제 가 발생 합 니까?
여러 개의 스 레 드 가 같은 데 이 터 를 동시에 조작 하면 스 레 드 안전 문 제 를 초래 할 수 있다.예 를 들 어 전체적인 변수,정적 변수,같은 데이터 의 데이터 베이스 작업 등;
부분 변 수 는 일반적으로 스 레 드 안전 문제 가 존재 하지 않 습 니 다.
3)흔히 볼 수 있 는 라인 안전 해결 방법:
1)전역 변 수 를 사용 하지 않 고 전역 변 수 를 국부 변수 로 정의 합 니 다.
2)동기 화 잠 금 을 추가 하여 스 레 드 를 동기 화 합 니 다.
a.Synchronized 동기 화 키 워드 는 방법 과 코드 블록 에 추가 할 수 있 습 니 다.
/**
* synchronized ,
* , class
* , this, synchronized(this)
* ,
*/
public static synchronized void salTicket(){
if (ticketNum > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + ticketNum-- + " ");
System.out.println(Thread.currentThread().getName() + " ");
}else {
System.out.println(" ,"+Thread.currentThread().getName() + " ");
}
}
b.여러 스 레 드 방법 이 동기 화 되 는 지 여 부 는 여러 스 레 드 가 같은 자 물 쇠 를 공유 하 는 지 판단 해 야 합 니 다.
/**
*
*/
public void salTicket2() {
synchronized (this) {
//() ,this , ,
// class,
if (ticketNum > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + ticketNum-- + " ");
System.out.println(Thread.currentThread().getName() + " ");
} else {
System.out.println(" ," + Thread.currentThread().getName() + " ");
}
}
}
c.ReentrantLock 대상 의 lock 방법 은 자 물 쇠 를 추가 하고 unLock 은 자 물 쇠 를 해제 합 니 다.언 락 은 finally 에 넣 어야 합 니 다.최종 적 으로 자 물 쇠 를 풀 수 있 도록 확보 하기;
// private static ReentrantLock lock=new ReentrantLock();
/**
* lock , lock ,
*/
public void salTicket3() {
lock.lock();//
if (ticketNum > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();// , finally ,
}
System.out.println(Thread.currentThread().getName() + " " + ticketNum-- + " ");
System.out.println(Thread.currentThread().getName() + " ");
} else {
System.out.println(" ," + Thread.currentThread().getName() + " ");
}
}
3)데이터 베 이 스 를 조작 하면 낙관적 인 잠 금 또는 비관 적 인 잠 금 방식 도 사용 할 수 있다.4)Springmvc 는 어떻게 라인 안전 문 제 를 해결 합 니까?
Springmvc 의 데이터 수신 과 전달 은 모두 방법 등급 이 고 국부 변 수 를 사용 하여 수신 하고 전달 하기 때문에 라인 안전 문제 가 존재 하지 않 습 니 다.
4.Wait 와 notify
스 레 드 간 통신 의 메커니즘스 레 드 간 전환 을 수 동 으로 제어 합 니 다.동기 코드 의 잠 금 대상 호출.동시에 공유 메모리 대상 을 통 해 데이터 의 전달 을 실현 할 수 있다.
a.하나의 큰 임 무 를 여러 개의 작은 임무 로 나 누 어 다 중 스 레 드 로 수행 합 니 다.
다 중 스 레 드 의 효율 이 반드시 단일 스 레 드 의 효율 보다 높 은 것 은 아니다.
스 레 드 탱크 를 통 해 스 레 드 를 만 들 고 runnable(반환 값 없 음)이나 callable(반환 값 있 음)인 터 페 이 스 를 통 해 작업 을 정의 합 니 다.
스 레 드 탱크 의 submit invoke invokeAll 등 방법 으로 임 무 를 수행 합 니 다.
b.스 레 드 비동기 로 특정한 임 무 를 완성 하고 동시 응답 능력 을 향상 시 키 거나 스 레 드 가 주기 적 으로 특정한 임 무 를 수행 하도록 합 니 다.
c.네 가지 스 레 드 탱크 의 특징 과 생 성;
자바 는 Executors 를 통 해 네 가지 스 레 드 풀 을 제공 합 니 다.각각:
1)new CachedThreadPool 은 캐 시 가능 한 스 레 드 풀 을 만 듭 니 다.스 레 드 풀 의 길이 가 처리 수 요 를 초과 하면 남 은 스 레 드 를 유연 하 게 회수 할 수 있 습 니 다.회수 할 수 없 으 면 새 스 레 드 를 만 듭 니 다.
2)new Fixed ThreadPool 은 스 레 드 의 최대 병발 수 를 제어 할 수 있 는 스 레 드 풀 을 만 들 고 초과 한 스 레 드 는 대기 열 에서 기다 릴 것 입 니 다.
3)new Scheduled ThreadPool 은 정기 적 이 고 주기 적 인 작업 수행 을 지원 하 는 고정 라인 풀 을 만 듭 니 다.
4)new Single ThreadExecutor 는 단일 라인 화 된 스 레 드 풀 을 만 듭 니 다.유일한 작업 스 레 드 로 만 작업 을 수행 하고 모든 작업 이 지 정 된 순서(FIFO,LIFO,우선 순위)에 따라 실 행 될 수 있 도록 합 니 다.
//jdk
//1.
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
//2.
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//3. ,
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
//4.
ExecutorService executorService = Executors.newSingleThreadExecutor();
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.