最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

Java线程Join方法的理解和说明

Java 宇托 823浏览 暂无评论

Java线程Join方法说白了就是等待。具体来说,就是一个线程要等另一个线程完成之后才能进行之后的操作。

当然,当两个线程做的工作完全无关联时,那就不需要用到Join。

我们举例来说明Join。比如说小张和小王合居。每天下午两个人需要做事有四件:洗衣服、洗碗、洗菜、做菜,每件事需时5分钟。其中,必须要先洗完菜才可以做菜。

第一天:小张因为有事,所以他只洗衣服。小王洗碗、洗菜、做菜。小张和小王的工作没有任何关联,所以他们谁先完成都行。模拟代码(等待时间都设置为1秒)如下:

Java
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        final Thread zhang = new Thread("小张") {
            @Override
            public void run() {
                doSomething(this.getName(), "洗衣服", 1);
            }
        };

        final Thread wang = new Thread("小王") {
            @Override
            public void run() {
                doSomething(this.getName(), "做饭", 1);
                doSomething(this.getName(), "洗菜", 1);
                doSomething(this.getName(), "做菜", 1);
            }
        };

        zhang.start();
        wang.start();
    }

    public static void doSomething(String name, String thing, long castTime) {
        try {
            System.out.println(String.format("%tT -> %s:%s开始", new Date(), name, thing));
            Thread.sleep(castTime * 1000);
            System.out.println(String.format("%tT -> %s:%s结束", new Date(), name, thing));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果如下:

16:11:17 -> 小张:洗衣服开始
16:11:17 -> 小王:做饭开始
16:11:18 -> 小王:做饭结束
16:11:18 -> 小王:洗菜开始
16:11:18 -> 小张:洗衣服结束
16:11:19 -> 小王:洗菜结束
16:11:19 -> 小王:做菜开始
16:11:20 -> 小王:做菜结束

第二天:小张觉得昨天他没做什么,所以他这天洗衣服、洗碗、洗菜;小王做菜。这样两者就有了关联,如果不加Join。模拟如下:

Java
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        final Thread zhang = new Thread("小张") {
            @Override
            public void run() {
                doSomething(this.getName(), "洗衣服", 1);
                doSomething(this.getName(), "做饭", 1);
                doSomething(this.getName(), "洗菜", 1);
            }
        };

        final Thread wang = new Thread("小王") {
            @Override
            public void run() {
                doSomething(this.getName(), "做菜", 1);
            }
        };

        zhang.start();
        wang.start();
    }

    public static void doSomething(String name, String thing, long castTime) {
        try {
            System.out.println(String.format("%tT -> %s:%s开始", new Date(), name, thing));
            Thread.sleep(castTime * 1000);
            System.out.println(String.format("%tT -> %s:%s结束", new Date(), name, thing));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果如下:

16:12:51 -> 小王:做菜开始
16:12:51 -> 小张:洗衣服开始
16:12:52 -> 小王:做菜结束
16:12:52 -> 小张:洗衣服结束
16:12:52 -> 小张:做饭开始
16:12:53 -> 小张:做饭结束
16:12:53 -> 小张:洗菜开始
16:12:54 -> 小张:洗菜结束

这样明显结果是不对了,因为做菜在洗菜之前完成了。这种情况下,我们就需要Join。要等小张把所有的事做完然后小王再做菜。模拟代码如下:

Java
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        final Thread zhang = new Thread("小张") {
            @Override
            public void run() {
                doSomething(this.getName(), "洗衣服", 1);
                doSomething(this.getName(), "做饭", 1);
                doSomething(this.getName(), "洗菜", 1);
            }
        };

        final Thread wang = new Thread("小王") {
            @Override
            public void run() {
                try {
                    zhang.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                doSomething(this.getName(), "做菜", 1);
            }
        };

        zhang.start();
        wang.start();
    }

    public static void doSomething(String name, String thing, long castTime) {
        try {
            System.out.println(String.format("%tT -> %s:%s开始", new Date(), name, thing));
            Thread.sleep(castTime * 1000);
            System.out.println(String.format("%tT -> %s:%s结束", new Date(), name, thing));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果如下:

16:15:36 -> 小张:洗衣服开始
16:15:37 -> 小张:洗衣服结束
16:15:37 -> 小张:做饭开始
16:15:38 -> 小张:做饭结束
16:15:38 -> 小张:洗菜开始
16:15:39 -> 小张:洗菜结束
16:15:39 -> 小王:做菜开始
16:15:40 -> 小王:做菜结束

转载请注明:宇托的狗窝 » Java线程Join方法的理解和说明

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址