지난 2 년 동안 Android에서 일하면서 Android 소스 코드를 연구함으로써 Multi-Shreading의 Java 동시 처리에 대한 이해도 있습니다.
문제는 직렬 스레드 풀을 구현하는 방법입니다.
직렬 스레드 풀 란 무엇입니까?
다시 말해서, 우리의 달리는 객체에는 큐 메커니즘이 있어야하는 큐 메커니즘이 있어야하며,이 큐의 꼬리에서 순서대로 들어가고 큐 헤드에서 실행할 수있는 선택을 선택해야합니다.
아이디어가 있기 때문에 필요한 데이터 구조를 고려해 봅시다.
우리는 대기열 끝에서 달리는 객체를 삽입하고 큐 헤드에서 런닝 가능한 객체를 실행하기 때문에 자연스럽게 큐가 필요합니다. Java의 SDK는 Double-Ended equeue : Arraydeque <Runnable>과 같은 좋은 큐 데이터 구조를 제공했습니다.
import java.util.arraydequ; import java.util.concurrent.blockingqueue; import java.util.concurrent.linkedBlockingDeque; import java.util.concurrent.threadfactory; import java.util.concurrent.threadpoolexecutor; import java.util.conceprent; java.util.concurrent.atomic.atomicinteger;/*** 16-1-5의 Wzy에 의해 만들어졌습니다. */공개 클래스 Serialexecutor {개인 실행 가능한 mactive; private arraydequ <runnable> marraydequ = new arraydequ <> (); 비공개 정적 최종 int cpu_count = runtime.getRuntime (). availProcessors (); 개인 정적 최종 최종 int core_pool_size = cpu_count + 1; 비공개 정적 최종 int maximum_pool_size = cpu_count * 2 + 1; 비공개 정적 최종 int keep_alive = 1; 개인 정적 최종 블록 큐어 <Runnable> Spoolworkqueue = New LinkedBlockingDeque <> (128); Private STATIC Final ThreadFactory sthreadFactory = new ThreadFactory () {Private Final AtomicInteger McOUNT = New AtomicInteger (1); @override public Thread NewThread (runnable r) {return new Thread (R, "Serial Thread #" + McOUNT.GetAndIncrement ()); }}; Private STATIC FINNS THREADPOOLEXECUTOR Thread_Executor = New ThreadPool_Size (Core_Pool_Size, Maximum_Pool_Size, recep_alive, TimeUnit.seconds, Spoolworkqueue, sthreadfactory); public synchronized void execute (Final Runnable r) {marraydequ.offer (new Runnable () {@override public void run () {try {r.run ();} 최종 {schedulenext ();}}}); // 큐에 처음으로 가입하면 mactive가 비어 있으므로 (mactive == null) {schedulenext (); }} private void schedulenext () {if ((mactive = marraydequ.poll ())! = null) {Thread_Executor.Execute (mactive); }} public static void main (String [] args) {serialexecutor serialexecutor = new serialexecutor (); for (int i = 0; i <10; i ++) {최종 int j = i; serialexecutor.execute (new runnable () {@override public void run () {system.out.println ( "num is :" + (j + 1)); try {thread.sleep (1000);} catch (InterpruptedExcept e) {e.printstacktrace ();}}); }}}실행 결과는 다음과 같습니다.
Num은 다음과 같습니다. 1
Num은 다음과 같습니다. 2
Num은 다음과 같습니다. 3
Num은 다음과 같습니다. 4
Num은 다음과 같습니다. 5
Num은 : 6입니다
Num은 : 7입니다
Num은 다음과 같습니다. 8
Num은 : 9입니다
Num은 : 10입니다
위는 Java 동시성의 직렬 스레드 풀 인스턴스 분석에 대한이 기사의 모든 내용이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!