이 기사에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!