> Java > java지도 시간 > 본문

Java 다중 스레드를 순차적으로 실행하는 여러 방법에 대한 샘플 코드

黄舟
풀어 주다: 2017-03-18 10:19:08
원래의
1586명이 탐색했습니다.

이 기사에서는 Java 멀티 스레드의 여러 가지 순차적 실행 방법에 대한 요약에 대한 관련 정보를 주로 소개합니다. 필요한 친구는 다음을 참조할 수 있습니다.

Java 멀티 스레드의 여러 가지 순차적 실행 방법

동료가 우연히 이런 질문을 제기하고 두 가지 방법을 직접 실천했습니다. 물론 더 좋고 더 나은 방법이 분명히 있습니다.

방법 1

import java.util.concurrent.atomic.AtomicInteger;

public class OrderedThread1 {
 
 static AtomicInteger count = new AtomicInteger(0);

 public static void main(String[] args) throws InterruptedException {
 Task task1 = new Task(count, 0);
 Task task2 = new Task(count, 1);
 Task task3 = new Task(count, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
 
 Thread.sleep(1 * 1000);
 }

}

class Task implements Runnable {
 
 private AtomicInteger count;
 private int order;
 
 public Task(AtomicInteger count, int order) {
 this.count = count;
 this.order = order;
 }

 @Override
 public void run() {
 while (true) {
  if (count.get() % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  count.incrementAndGet();
  }
 }
 }
}
로그인 후 복사

이 방법이 더 일반적인 해결책이 될 것입니다. 스레드 승인 순서를 제어하려면 원자 증분을 사용하십시오.

방법 2

public class OrderedThread2 {
 static Holder holder = new Holder();
 public static void main(String[] args) throws InterruptedException {
 
 Task1 task1 = new Task1(holder, 0);
 Task1 task2 = new Task1(holder, 1);
 Task1 task3 = new Task1(holder, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
 
 Thread.sleep(1 * 1000);
 

 }

}

class Task1 implements Runnable {
 
 Holder holder;
 int order;
 
 public Task1(Holder holder, int order) {
 this.holder = holder;
 this.order = order;
 }

 @Override
 public void run() {
 while (true) {
  if (holder.count % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  holder.count ++;
  }
 }
// int i = 0;
// while(i ++ < 10000){
//  holder.count ++;
// }
 }
}
class Holder {
 volatile int count = 0;
}
로그인 후 복사

방법 2는 휘발성 키워드를 사용합니다. 각 스레드가 최신 카운트 값을 가져오도록 합니다. 스레드 중 하나가 ++ 작업을 수행하면 다른 두 스레드는 최신 값을 가져오고 승인 조건이 충족되는지 확인합니다.

ps: 휘발성은 스레드로부터 안전하지 않습니다. 그리고 그 둘은 서로 아무런 관련이 없습니다. 휘발성 변수는 사용자 스레드에 복사본을 보관하지 않으므로 모든 스레드에 최신 값을 제공합니다. 그러나 여러 스레드가 동시에 변수를 업데이트하면 결과는 명백합니다. 마지막 업데이트가 모든 이전 업데이트를 덮어쓰므로 스레드가 불안정해집니다. 두 번째 방법에서는 한 번에 하나의 스레드만 허용 조건을 충족하므로 동시 변수 업데이트가 없습니다. 휘발성 값을 최신 상태로 유지하는 것은 스레드 안전성과 전혀 관련이 없으므로 동시성 제어를 구현하기 위해 휘발성을 오용하지 마십시오.

위 내용은 Java 다중 스레드를 순차적으로 실행하는 여러 방법에 대한 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!