Java: How to use Thread.join

后端 未结 3 374
清歌不尽
清歌不尽 2020-11-30 07:09

I\'m new to threads. How can I get t.join to work, whereby the thread calling it waits until t is done executing?

This code would just freeze the progr

相关标签:
3条回答
  • 2020-11-30 07:17

    Use something like this:

    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);
        }
    
    0 讨论(0)
  • 2020-11-30 07:18

    With otherThread being the other thread, you can do something like this:

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

    The Java-tutorial from Sun: http://java.sun.com/docs/books/tutorial/essential/concurrency/join.html

    0 讨论(0)
  • 2020-11-30 07:20

    You have to call the join method on the other Thread.
    Something like:

    @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 讨论(0)
提交回复
热议问题