Thead 클래스를 상속하여 멀티스레딩을 구현합니다.
장점: 작성이 간단합니다. 현재 스레드에 액세스해야 하는 경우 Thead.currentThread() 메서드를 사용하는 대신 이 메서드를 사용하면 됩니다.
단점: 이 스레드 클래스는 Thead 클래스를 상속받았기 때문에 다른 클래스를 상속할 수 없습니다.
샘플 코드:
다음과 같이 코드 코드를 복사합니다.
패키지 org.frzh.thread;
공개 클래스 FirstThread는 Thread를 확장합니다.
개인 int i;
//run 메서드를 다시 작성합니다. run 메서드의 메서드 본문은 스레드 실행 본문입니다.
공개 무효 실행() {
for (; i < 100; i++) {
//스레드 클래스가 Thread 클래스를 상속하는 경우 getName 메서드를 직접 호출하여 현재 스레드 이름을 얻을 수 있습니다.
//현재 스레드를 가져오려면 이것을 직접 사용하십시오.
//Thread 객체의 getName 메소드는 현재 스레드의 이름을 반환합니다.
System.out.println(getName() + " " + i);
}
}
공개 정적 무효 메인(String[] args) {
for (int i = 0; i < 100; i++) {
//Thead의 currentThread 메소드를 호출하여 현재 스레드를 가져옵니다.
System.out.println(Thread.currentThread().getName() + " " +i);
if (i == 20) {
새로운 FirstThread().start();
새로운 FirstThread().start();
}
}
}
}
실행 결과 조각:
우리는 두 개의 하위 스레드에 있는 i의 값이 연속적이지 않다는 것을 발견했습니다. 이는 하위 스레드에 의한 데이터의 직접 공유에 대해 우리가 말한 것과 일치하지 않는 것 같습니다. 실제로 여기서는 각각 자체 인스턴스 변수 i를 갖는 두 개의 하위 스레드를 인스턴스화합니다.
Runable 인터페이스를 구현하는 멀티스레딩 사용:
장점: 스레드 클래스는 Runable 인터페이스만 구현하므로 다른 클래스도 상속할 수 있습니다.
이 경우 여러 스레드가 대상 개체를 공유할 수 있으므로 여러 스레드가 동일한 리소스를 처리하는 데 매우 적합하므로 CPU, 코드 및 데이터를 분리하여 명확한 모델을 형성하고 개체 지향적 사고를 향상시킬 수 있습니다. .
단점: 프로그래밍이 약간 복잡합니다. 현재 스레드에 액세스하려면 Thread.currentThread 메서드를 사용해야 합니다.
샘플 코드:
다음과 같이 코드 코드를 복사합니다.
패키지 org.frzh.thread;
공개 클래스 SecondThread는 Runnable을 구현합니다.
개인 int i;
@보수
공개 무효 실행() {
// TODO 자동 생성된 메서드 스텁
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
공개 정적 무효 메인(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 20) {
SecondThread st = 새로운 SecondThread();
new Thread(st, "하위 스레드 1").start();
new Thread(st, "하위 스레드 2").start();
}
}
}
}
실행 결과 조각:
쓰레드 1과 쓰레드 2가 동일한 타겟을 공유하고 있기 때문에 이때의 i값이 계속해서 변하는 것을 볼 수 있다.