WebHU - Programozási kérdések és válaszok

Hogyan működik a maximumPoolSize of ThreadPoolExecutor?

Megpróbálom megérteni a ThreadPoolExecutor osztályt. Elolvastam ezt a választ és a Javadoc-ot. De az én kísérletem nem egyezik ezzel a leírással:

Inicializálom a threadpoolt egy gyárral az azonosítók követésére

int tcounter = 0;
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.MINUTES,
        new ArrayBlockingQueue<Runnable>(1000), new ThreadFactory() {

            @Override
            public Thread newThread(Runnable r) {
                return new mThread(tcounter++, r);
            }
        });

public class mThread extends Thread {
    int id;

    private mThread(int id, Runnable run) {
        super(run);
        GLog.e("created thread " + id);
        this.id = id;
    }

}

akkor a feladat:

public class mRunanble implements Runnable {
    int value = 0;

    private mRunanble(int value) {
        super();
        this.value = value;
    }

    @Override
    public void run() {
        SystemClock.sleep(3000);
        Thread t = Thread.currentThread();
        if (t instanceof mThread) {

            GLog.e("Say " + (value) + " on thread " + ((mThread) t).id);
        } 

    }

}

és rendeljen hozzá egy gombot a művelethez:

executor.execute(new mRunanble(i++));

De azt a gombot elküldöm, és a harmadik szál soha nem jön létre, tehát mi a második paraméter a ThreadPoolExecutor konstruktorban (maximumPoolSize=4). 4 szál létrehozására számítottam, és ebből kettőt meg kell ölni a kivégzés vége után 1 perccel


  • ez azért van, mert a szálai alszanak? talán megváltoztatja a futtatható képességét egy szorgos várakozásra, és meg fogja adni a várt eredményt 02.09.2012

Válaszok:


1

A ThreadPoolExecutorban a maximumPoolSize jön képbe, amikor a corePoolSize no nem elegendő a feladatok végrehajtásához, és ha az összes nemet lefoglalják a feladatok, akkor csak egy újabb lépcső jön létre a feladat végrehajtásához. Ez a nem maxPoolSize-ig nőhet.

Szerkesztés félreértette a maxPoolsize fogalmát. Kérjük, tekintse meg az alábbi linket.

http://www.bigsoft.co.uk/blog/index.php/2009/11/27/rules-of-a-threadpoolexecutor-pool-size

02.09.2012
  • Tehát amikor spam-et küldök a gombra, akkor a maximumPoolSize létrehozásáig további 2 szálat kell létrehozni, igaz? 02.09.2012
  • +1 a következőre: Vegyük ezt a példát. A kiinduló szálkészlet mérete 1, az alapkészlet mérete 5, a maximális készletméret 10, a várólista pedig 100. Sun módszere: ahogy a kérések érkeznek, szálak jönnek létre 5-ig, majd a feladatok hozzáadódnak a sorhoz, amíg el nem éri 100. Amikor a sor megtelik, új szálak jönnek létre maxPoolSize-ig. Ha az összes szál használatban van, és a várólista megtelt, a feladatokat a rendszer elutasítja. A várakozási sor csökkenésével az aktív szálak száma is csökken. 08.08.2013

  • 2

    A ThreadPoolExecutor:

    Ha a corePoolSize-nél több, de a maximumPoolSize-nél kevesebb szál fut, akkor csak akkor jön létre új szál, ha a várólista megtelt.

    A sor soha nem töltődik be, mivel kapacitása 1000. Ha a kapacitást 1-ra módosítja, látni fogja, hogy a Threads létrejön.

    A Executors osztály egy SynchronousQueue a newCachedThreadPool metódusaihoz, így szeretné fontolóra venni a használatát is.

    02.09.2012
  • Ha csökkentem az értéket, egy java.util.concurrent.RejectedExecutionException-t kapok 02.09.2012
  • amint csökkenti a számot, először eléri a maxPoolSize korlátot, majd elutasítja a feladatokat. Így közvetlenül a kivétel előtt kinyomtathatja a készlet méretét, amely megegyezik a maxpoolsize-vel. 02.09.2012

  • 3

    Ha azt szeretné, hogy a ThreadPool új további szálat hozzon létre (a készlet méretének bővítéséhez a maximumPoolSize paraméter szerint), hajtsa végre ezt az egyszerű példát:

    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
    
            ThreadPoolExecutor tpe = new ThreadPoolExecutor(
                    1, 2, 500, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<>(1));
            System.out.println("init pool size= " + tpe.getPoolSize() + ", queue size=" + tpe.getQueue().size());
    
            tpe.execute(new Task("1st", 10000));
            Thread.sleep(1000);
            print(tpe, "1st");
    
            tpe.execute(new Task("2nd", 0));
            Thread.sleep(1000);
            print(tpe, "2nd");
    
            tpe.execute(new Task("3d", 2000));
            Thread.sleep(1000);
            print(tpe, "3d");
    
            while (tpe.getPoolSize()>1) {           
                Thread.sleep(100);
            }
            System.out.println("pool size= " + tpe.getPoolSize() + ", queue size=" + tpe.getQueue().size());
            tpe.shutdown();
        }
    
        private static void print(ThreadPoolExecutor tpe, String name) {
            System.out.println("After " + name + " execute -  pool size= " + tpe.getPoolSize() + ", queue=" + tpe.getQueue());
        }
    
        private static class Task implements Runnable {
    
            private final String name;
            private final long time;
    
            Task(String name, long time) {
                this.name = name;
                this.time = time;
            }
    
            @Override
            public void run() {
                System.out.println("Run " + Thread.currentThread().getName() + "-" + name);
                try {
                    Thread.sleep(time);
                } catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("Finish " + Thread.currentThread().getName() + "-" + name);
            }
    
            @Override
            public String toString() {
                return name;
            }
    
        }
    }
    

    Megkapja a kimenetet, amely bemutatja a maximumPoolSize és a keepAliveTime hatását:

    init pool size= 0, queue size=0
    Run pool-1-thread-1-1st
    After 1st execute -  pool size= 1, queue=[]
    After 2nd execute -  pool size= 1, queue=[2nd]
    Run pool-1-thread-2-3d
    After 3d execute -  pool size= 2, queue=[2nd]
    Finish pool-1-thread-2-3d
    Run pool-1-thread-2-2nd
    Finish pool-1-thread-2-2nd
    pool size= 1, queue size=0
    Finish pool-1-thread-1-1st
    
    27.07.2016
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..