web-dev-qa-db-fra.com

Java: Comment utiliser Thread.join

Je suis nouveau dans les discussions. Comment puis-je faire fonctionner t.join, le thread l’appelant attendant que t s’exécute? 

Ce code ne ferait que figer le programme, car le thread attend sa propre mort, non?

public static void main(String[] args) throws InterruptedException {
    Thread t0 = new Thready();
    t0.start();

}

@Override
public void run() {
    for (String s : info) {
        try {
            join();
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("%s %s%n", getName(), s);
    }   
}

Que ferais-je si je voulais avoir deux threads, dont l'un imprime la moitié du tableau info, puis attend que l'autre termine avant de faire le reste?

16
Nick Heiner

Utilisez quelque chose comme ceci:

public void executeMultiThread(int numThreads)
   throws Exception
{
    List threads = new ArrayList();

    for (int i = 0; i < numThreads; i++)
    {
        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
                // do your work
            }
        });

        // System.out.println("STARTING: " + t);
        t.start();
        threads.add(t);
    }

    for (int i = 0; i < threads.size(); i++)
    {
        // Big number to wait so this can be debugged
        // System.out.println("JOINING: " + threads.get(i));
        ((Thread)threads.get(i)).join(1000000);
    }
17
Francis Upton

Avec otherThread étant l'autre fil, vous pouvez faire quelque chose comme ceci:

@Override
public void run() {
    int i = 0;
    int half = (info.size() / 2);

    for (String s : info) {
        i++;
        if (i == half) {
        try {
            otherThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("%s %s%n", getName(), s);
        Thread.yield(); //Give other threads a chance to do their work
    }       
}

Le tutoriel Java de Sun: http://Java.Sun.com/docs/books/tutorial/essential/concurrency/join.html

4
Sven Lilienthal

Vous devez appeler la méthode join sur l'autre thread.
Quelque chose comme: 

@Override
public void run() {
    String[] info = new String[] {"abc", "def", "ghi", "jkl"};

    Thread other = new OtherThread();
    other.start();

    for (int i = 0; i < info.length; i++) {
        try {
            if (i == info.length / 2) {
                other.join();    // wait for other to terminate
            }
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("%s %s%n", getName(), info[i]);
    }       
}
0
Carlos Heuberger