초보 자 자바 다 중 스 레 드 기초 지식 이해
JDK 에 서 는 Thread.State 클래스 로 스 레 드 의 몇 가지 상 태 를 정의 합 니 다.
다 중 스 레 드 를 실현 하려 면 메 인 스 레 드 에 새로운 스 레 드 대상 을 만들어 야 합 니 다.자바 언어 는 Thread 클래스 와 하위 클래스 의 대상 을 사용 하여 스 레 드 를 표시 합 니 다.완전한 수명 주기 에 다음 과 같은 다섯 가지 상 태 를 겪 어야 합 니 다.
주의:
1.신축 과 사망 상 태 는 한 번 만 가능 합 니 다.
2.운행 상 태 는 준비 상태 에서 만 바 뀔 수 있다.
3.차단 상태 가 직접 운행 상태 로 변 할 수 없 으 므 로 준비 상 태 를 통과 해 야 합 니 다.
4.실행 상태의 스 레 드 가 yield()방법 을 호출 하면 준비 상태 가 됩 니 다.
5.실행 상태의 스 레 드 가 sleep()를 호출 하고 동기 화 잠 금 방법,wait()방법 또는 join()방법 을 기다 리 면 차단 상 태 를 처리 합 니 다.
6.차단 상태의 스 레 드 가 notify()/notify All()방법 을 호출 하거나 sleep()방법 이 끝나 거나 동기 화 잠 금 을 얻 거나 join()스 레 드 가 실행 되면 준비 상태의 스 레 드 로 변 할 수 있 습 니 다.
7.한 스 레 드 가 너무 많이 실 행 된 후에 사망 상 태 를 처리 합 니 다.즉,스 레 드 수명 주기 가 끝 납 니 다.
2.스 레 드 동기 화
1.왜 스 레 드 동기 화
스 레 드 안전 문 제 를 해결 하기 위해 다 중 스 레 드 에서 여러 스 레 드 가 하나의 데 이 터 를 수정 할 때 데이터 오류 가 발생 할 수 있 기 때문에 우 리 는 스 레 드 동기 화 방법 으로 문 제 를 해결 해 야 합 니 다.
자바 의 스 레 드 동기 화 구현 방식:
2、synchronized
2.1 동기 코드 블록
예시:
public class MyRunnableTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable,"A");
Thread thread1 = new Thread(myRunnable,"B");
Thread thread2 = new Thread(myRunnable,"C");
Thread thread3 = new Thread(myRunnable,"D");
Thread thread4 = new Thread(myRunnable,"E");
thread.start();
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
public class MyRunnable implements Runnable{
@Override
public void run() {
synchronized (Thread.class){
System.out.println(Thread.currentThread().getName()+" ");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
메모:동기 잠 금 은 임의의 대상 일 수 있 지만 이 대상 은 유일 해 야 합 니 다.동기 코드 블록 이 있 는 위치 도 매우 중요 합 니 다.동기 코드 블록 은 데이터 문 제 를 일 으 키 는 모든 코드 를 감 싸 야 합 니 다.많이 싸 서 는 안 되 고 적 게 싸 서 는 안 됩 니 다.우 리 는 보통 동기 화 잠 금 으로 바이트 파일 을 사용한다.2.2 동기 화 방법
예시:
public class MyRunnableTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable,"A");
Thread thread1 = new Thread(myRunnable,"B");
Thread thread2 = new Thread(myRunnable,"C");
Thread thread3 = new Thread(myRunnable,"D");
Thread thread4 = new Thread(myRunnable,"E");
thread.start();
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
public class MyRunnable implements Runnable{
@Override
public void run() {
test()
}
public synchronized void test(){
System.out.println(Thread.currentThread().getName()+" ");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
**주의:**다 중 스 레 드 의 공유 데이터 문 제 를 동기 화 방법 으로 처리 할 때 정적 방법 이 라면 클래스 이름.class 방식 을 사용 합 니 다.비 정적 방법 이 라면 this 를 사용 합 니 다.3.자물쇠
Lock.lock()을 사용 하여 잠 금 을 추가 한 후 Lock.unlock()방법 으로 잠 금 을 풀 수 있 습 니 다.
Lock 은 인터페이스 로 직접 예화 할 수 없고 하위 클래스 를 사용 하여 예화 해 야 합 니 다.일반적으로 사용 하 는 하위 클래스 는 ReentrantLock 입 니 다.
public class MyRunnableTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable,"A");
Thread thread1 = new Thread(myRunnable,"B");
Thread thread2 = new Thread(myRunnable,"C");
Thread thread3 = new Thread(myRunnable,"D");
Thread thread4 = new Thread(myRunnable,"E");
thread.start();
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
public class MyRunnable implements Runnable{
Lock lock = new ReentrantLock();
lock.lock();
System.out.println(Thread.currentThread().getName()+" ");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
설명:동기 화 작업 이 필요 한 코드 블록 전에 Lock.lock()방법 으로 잠 금 처 리 를 해 야 합 니 다.동기 화 된 코드 블록 이후 finally 구문 블록 을 추가 하여 자 물 쇠 를 풀 고 자 물 쇠 를 풀 어 주 는 방법 은 Lock.unlock()방법 입 니 다.자물쇠 가 풀 릴 수 있 도록 확보 해 야 한다.그렇지 않 으 면 자물쇠 다.
Lock 은 synchronized 보다 경량급 이 고 기능 이 강 하 며 가능 한 한 Lock 을 사용 할 수 있다.
기본 개념
프로그램,프로 세 스,스 레 드
4.567917.프로그램(program)은 특정한 임 무 를 수행 하기 위해 특정한 언어 로 작 성 된 명령 의 집합 이다.정적 코드,정적 대상 을 말 합 니 다
응용 프로그램의 응답 을 높이다.도형 화 인터페이스 에 더욱 의미 가 있 고 사용자 체험 을 강화 할 수 있다컴퓨터 시스템 CPU 의 이 용 률 을 높이다프로그램 구 조 를 개선 하 다.길 고 복잡 한 프로 세 스 를 여러 스 레 드 로 나 누 어 독립 적 으로 운행 하여 이해 와 수정 에 유리 합 니 다5.다 중 스 레 드 생 성
자바 에서 우 리 는 자바.lang.Thread 클래스 를 사용 하여 실현 할 수 있 습 니 다.우리 클래스 가 다 중 스 레 드 기능 을 가지 고 있 으 려 면,우리 클래스 가 Thread 클래스 를 계승 한 다음 run()방법 을 다시 쓰 고 start()방법 으로 다 중 스 레 드 를 시작 해 야 합 니 다.
예시 1:
public class MyThread extends Thread{
public void run(){
for (int i = 0; i < 50; i++) {
System.out.println("MyThread:"+i);
}
}
}
public class MyThreadTest{
public static void main(String[] args){
Thread t1 = new MyThread();
t1.start();
for (int i = 0; i < 20; i++) {
System.out.println("world=====" + i);
}
}
}
설명:자바 클래스 계승 Thread 클래스 를 만 들 고 부모 클래스 Thread 의 run 방법 을 다시 쓰 며 run 방법 에 구체 적 인 다 중 스 레 드 업 무 를 씁 니 다.스 레 드 클래스 의 대상 을 만 들 고 start 방법 으로 다 중 스 레 드 를 시작 합 니 다.**주의:**다 중 스 레 드 의 시작 호출 은 start 방법 입 니 다.jvm 바 텀 에서 start 방법 내부 에서 run 방법 을 호출 합 니 다.
한 대상 은 start()방법 을 한 번 만 호출 하면 이상 한'IllegalThreadState Exception'을 던 집 니 다.
예시 2:
public class MyRunnable implements Runnable {
public void run() {
for (int i = 0; i < 50 ; i++) {
System.out.println( "MyRunnable:"+i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = new Thread( new MyRunnable());
thread.start();// Thread start()
for (int i = 0; i < 50; i++) {
System.out.println("main:" + i);
}
}
}
설명:6.Thread 클래스 방법 소개
1)currentThread():현재 실행 중인 스 레 드 대상 의 인용 을 되 돌려 줍 니 다.
2)getName():현재 스 레 드 의 이름 을 되 돌려 줍 니 다.
3)isAlive():현재 스 레 드 의 생존 여 부 를 판단 합 니 다.
4)isDeaomon():스 레 드 가 수호 스 레 드 인지 판단
5)join():현재 스 레 드 에 다른 스 레 드 를 도입 하면 현재 스 레 드 가 막 힙 니 다.
6)sleep():현재 스 레 드 를 수면 상태 로 진입
7)yield():현재 스 레 드 로 하여 금 CPU 의 실행 권 을 포기 하고 다시 줄 에 들 어가 다른 스 레 드 와 평등 하 게 CPU 실행 을 쟁탈 하 게 합 니 다.
8)interrupt()중단 스 레 드 9)interrupted()현재 스 레 드 가 중단 되면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
예시:
public class ThreadTest {
public static void main(String[] args) {
// 1
Thread thread = new MyThread();
thread.start();
// 2
Thread thread1 = new Thread(new MyRunnable());
thread1.start();
// 3
MyCallable myCallable = new MyCallable();
FutureTask futureTask = new FutureTask(myCallable);
new Thread(futureTask).start();
for (int i = 0; i < 100; i++) {
if (i== 50){
// main i=50 thread , thread main
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("main:"+i);
}
}
}
public class MyThread extends Thread{
public void run(){
for (int i = 0; i < 100; i++) {
// void interrupt() true | false, true
//static boolean interrupted() , true; false。
Thread.currentThread().interrupt();
if (Thread.interrupted()){
System.out.println("Thread interrupted");
}
// static currentThread()
//String getName() 。
//Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("MyRunnable"+i);
// 1
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class MyCallable implements Callable {
@Override
public Object call() throws Exception {
for (int i = 0; i < 100; i++) {
System.out.println("MyCallable:"+i);
}
return null;
}
}
총결산이 글 은 여기까지 입 니 다.당신 에 게 도움 이 되 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.