zoukankan      html  css  js  c++  java
  • java-多线程-join函数

    join()>>不带参数

    线程A调用线程B.join,意思就是线程A并入了线程B,当执行完线程B,再去执行线程A后续动作

    join(int keepTims)>>带参数,与上面类似,区别在于线程B保持并入线程A中有保持时间,超过改时间,两线程再次分开

    案例1 

    package com.wp.join;
    
    public class JoinTest implements Runnable {
        
        public static int a = 0;
        
        @Override
        public void run() {
            for(;;){
                a++;
                System.out.println("变量A="+a);
                long now = System.currentTimeMillis();
                while (System.currentTimeMillis() - now < 1000) {
                }
                if(a>8){
                    break;
                }
            }
        }
        
        public static void main(String[] args) {
            Thread task = new Thread(new JoinTest());
            task.start();
            try {
                task.join(9000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("End var = "+a);
        }
        
    }

    案例2 

    package com.wp.join;
    
    public class JoinTest2 {
    
        private static int num = 0;
    
        static class JoinThreadA extends Thread {
    
            @Override
            public void run() {
                while (true) {
                    num++;
                    long now = System.currentTimeMillis();
                    while (System.currentTimeMillis() - now < 200) {
                    }
                    System.out.println("选手A已跑" + num + "米");
                    if (num >= 100) {
                        break;
                    }
                }
            }
        }
    
        static class JoinThreadB extends Thread {
            protected JoinThreadA joina;
    
            public JoinThreadB(JoinThreadA joina) {
                this.joina = joina;
            }
    
            @Override
            public void run() {
                try {
                    joina.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                while (true) {
                    num++;
                    long now = System.currentTimeMillis();
                    while (System.currentTimeMillis() - now < 100) {
                    }
                    System.out.println("选手B已跑" + num + "米");
                    if (num >= 200) {
                        break;
                    }
                }
    
            }
        }
        static class JoinThreadC extends Thread {
            protected JoinThreadB joinb;
            
            public JoinThreadC(JoinThreadB joinb) {
                this.joinb = joinb;
            }
            
            @Override
            public void run() {
                try {
                    joinb.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                while (true) {
                    num++;
                    long now = System.currentTimeMillis();
                    while (System.currentTimeMillis() - now < 50) {
                    }
                    System.out.println("选手C已跑" + num + "米");
                    if (num >= 300) {
                        break;
                    }
                }
                
            }
        }
        
        static class JoinThreadD extends Thread {
            protected JoinThreadC joinc;
            
            public JoinThreadD(JoinThreadC joinc) {
                this.joinc = joinc;
            }
            
            @Override
            public void run() {
                try {
                    joinc.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                while (true) {
                    num++;
                    long now = System.currentTimeMillis();
                    while (System.currentTimeMillis() - now < 20) {
                    }
                    System.out.println("选手D已跑" + num + "米");
                    if (num >= 400) {
                        break;
                    }
                }
                
            }
        }
        
        
        public static void main(String[] args) throws Exception {
            System.out.println("比赛开始");
            JoinThreadA joina = new JoinThreadA();
            JoinThreadB joinb = new JoinThreadB(joina);
            JoinThreadC joinc = new JoinThreadC(joinb);
            JoinThreadD joind = new JoinThreadD(joinc);
            joina.start();
            joinb.start();
            joinc.start();
            joind.start();
            joind.join();
            System.out.println("比赛结束,最终跑完" + num + "米");
        }
    
    }

     案例三

    package com.wp.join;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class JoinTest3 {
        final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        static class JoinThread extends Thread {
            Thread syncThread;
    
            public JoinThread(Thread syncThread) {
                this.syncThread = syncThread;
            }
    
            @Override
            public void run() {
                synchronized (syncThread) {
                    System.out.println("线程A START");
                    long now = System.currentTimeMillis();
                    while (System.currentTimeMillis() - now < 5000) {
                    }
                    System.out.println("线程A END");
                }
            }
        }
    
        public static void main(String[] args) {
            System.out.println("开始时间:"+format.format(new Date()));
            Thread t1 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println("Begin sleep");
                    long now = System.currentTimeMillis();
                    while (System.currentTimeMillis() - now < 5000) {
                    }
                    System.out.println("End sleep");
    
                }
            });
            Thread t2 = new JoinThread(t1);
            t1.start();
            t2.start();
            try {
                t1.join(1000);//因为T1线程对象的锁被T2持有,所以必须等T2跑完,释放锁 所以此处等待的时间 1000+5000
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("结束时间:"+format.format(new Date()));
        }
    
    }
  • 相关阅读:
    CTO这点事(技术,业务,管理,情商,周期,趋势)转
    Unit Test相关问题汇总
    优秀的命令行文件传输程序(转)
    ZOJ3329之经典概率DP
    Sql Server 2005 开发版亲測可用下载地址
    Hadoop与HBase中遇到的问题
    Struts2自己定义拦截器实例—登陆权限验证
    手游Apk破解疯狂,爱加密apk加固保护开发人员
    HighCharts 具体使用及API文档说明
    Linux(SLES)挂载NTFS移动硬盘实践
  • 原文地址:https://www.cnblogs.com/ak23173969/p/5355593.html
Copyright © 2011-2022 走看看