Java: как использовать Thread.join

Я новичок в тредах. Как я могу заставить t.join работать, при этом поток, вызывающий его, ждет, пока не завершится выполнение t?

Этот код просто заморозит программу, потому что поток ждет своей смерти, верно?

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);
    }   
}

Что бы я сделал, если бы хотел иметь два потока, один из которых распечатывает половину массива info, а затем ждет завершения другого, прежде чем делать все остальное?


person Nick Heiner    schedule 15.12.2009    source источник


Ответы (3)


Используйте что-то вроде этого:

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);
    }
person Francis Upton IV    schedule 15.12.2009

Если otherThread является другим потоком, вы можете сделать что-то вроде этого:

@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
    }       
}

Учебник по Java от Sun: http://java.sun.com/docs/books/tutorial/essential/concurrency/join.html

person Sven Lilienthal    schedule 16.12.2009

Вы должны вызвать метод join в другом потоке.
Что-то вроде:

@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]);
    }       
}
person user85421    schedule 15.12.2009