多线程join的问题

package com.company;

/**
 * Created by Mr.Meng on 2016/7/1.
 */
public class Main2 {
    public static void main(String[] args) {
        Thread2 mTh1=new Thread2("A");
        Thread2 mTh2= new Thread2("B");
        System.out.println("id "+mTh1.getId());
        System.out.println("toString "+mTh1.toString());
        System.out.println("classLoader "+mTh1.getContextClassLoader());
        System.out.println("priority "+mTh1.getPriority());
        System.out.println("stackTrace "+mTh1.getStackTrace());
        System.out.println("state "+mTh1.getState());
        System.out.println("group "+mTh1.getThreadGroup());
        System.out.println("alive "+mTh1.isAlive());
        System.out.println("daemon "+mTh1.isDaemon());
        System.out.println("isInterrupted "+mTh1.isInterrupted());

        System.out.println("------------------------------");

        System.out.println("id "+mTh2.getId());
        System.out.println("toString "+mTh2.toString());
        System.out.println("classLoader "+mTh2.getContextClassLoader());
        System.out.println("priority "+mTh2.getPriority());
        System.out.println("stackTrace "+mTh2.getStackTrace());
        System.out.println("state "+mTh2.getState());
        System.out.println("group "+mTh2.getThreadGroup());
        System.out.println("alive "+mTh2.isAlive());
        System.out.println("daemon "+mTh2.isDaemon());
        System.out.println("isInterrupted "+mTh2.isInterrupted());

        mTh1.start();
        try {
            mTh1.join();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("state "+mTh1.getState());
        System.out.println("state "+mTh2.getState());
        mTh2.start();//这样做的话thread2等待thread1执行完以后再执行但是main的soutp也是一个线程
        //cpu很可能会先让主线程跑,不对是一定让主线程跑完也就是soutp跑完后再跑thread2
        System.out.println("state "+mTh1.getState());
        System.out.println("state "+mTh2.getState());
    }
}
class Thread2 extends Thread{
    private String name;
    public Thread2(String name) {
        this.name=name;
    }
    public void run() {

        for (int i = 0; i < 100; i++) {
            System.out.println(name + "运行  :  " + i);
            try {
                sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

如下是运行结果:
id 9
toString Thread[Thread-0,5,main]
classLoader sun.misc.Launcher$AppClassLoader@19821f
priority 5
stackTrace [Ljava.lang.StackTraceElement;@10b30a7
state NEW
group java.lang.ThreadGroup[name=main,maxpri=10]
alive false
daemon false

isInterrupted false

id 10
toString Thread[Thread-1,5,main]
classLoader sun.misc.Launcher$AppClassLoader@19821f
priority 5
stackTrace [Ljava.lang.StackTraceElement;@10b30a7
state NEW
group java.lang.ThreadGroup[name=main,maxpri=10]
alive false
daemon false
isInterrupted false
A运行 : 0
……
A运行 : 99
state TERMINATED
state NEW
state TERMINATED
state RUNNABLE
B运行 : 0
………
B运行 : 99

Process finished with exit code 0

下面是当thread1和thread2同时join的时候

package com.company;

/**
 * Created by Mr.Meng on 2016/7/2.
 */
public class Main3 {
    public static void main(String[] args) {
        Thread thread=Thread.currentThread();
        System.out.println(thread.getName());
        System.out.println("args = [" + thread.getPriority() + "]");
        Thread2 mTh1=new Thread2("A");
        Thread2 mTh2= new Thread2("B");

        mTh1.start();
        mTh2.start();
        try {
            mTh1.join();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("state " + mTh1.getState());
        System.out.println("state "+mTh2.getState());

        try {
            mTh2.join();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("state "+mTh1.getState());
        System.out.println("state "+mTh2.getState());
    }
}

“C:\Program Files (x86)\Java\jdk1.6.0_16\bin\java” -Didea.launcher.port=7547 “-Didea.launcher.bin.path=E:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\bin” -Dfile.encoding=UTF-8 -classpath “C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\rt.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.6.0_16\jre\lib\ext\sunpkcs11.jar;E:\Program Files (x86)\JetBrains\out\production\JetBrains;E:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.2\lib\idea_rt.jar” com.intellij.rt.execution.application.AppMain com.company.Main3
main
args = [5]
A运行 : 0
B运行 : 0
A运行 : 1
B运行 : 1
A运行 : 2
B运行 : 2
A运行 : 3
B运行 : 3
A运行 : 4
B运行 : 4
A运行 : 5
B运行 : 5
A运行 : 6
B运行 : 6
A运行 : 7
B运行 : 7
A运行 : 8
B运行 : 8
A运行 : 9
B运行 : 9
A运行 : 10
B运行 : 10
A运行 : 11
B运行 : 11
A运行 : 12
B运行 : 12
A运行 : 13
B运行 : 13
A运行 : 14
B运行 : 14
A运行 : 15
B运行 : 15
A运行 : 16
B运行 : 16
A运行 : 17
B运行 : 17
A运行 : 18
B运行 : 18
A运行 : 19
B运行 : 19
A运行 : 20
B运行 : 20
A运行 : 21
B运行 : 21
A运行 : 22
A运行 : 23
B运行 : 22
A运行 : 24
B运行 : 23
A运行 : 25
B运行 : 24
A运行 : 26
B运行 : 25
A运行 : 27
B运行 : 26
A运行 : 28
B运行 : 27
A运行 : 29
B运行 : 28
A运行 : 30
B运行 : 29
A运行 : 31
B运行 : 30
A运行 : 32
B运行 : 31
A运行 : 33
B运行 : 32
A运行 : 34
B运行 : 33
A运行 : 35
B运行 : 34
A运行 : 36
B运行 : 35
A运行 : 37
B运行 : 36
A运行 : 38
B运行 : 37
A运行 : 39
B运行 : 38
A运行 : 40
B运行 : 39
A运行 : 41
B运行 : 40
A运行 : 42
B运行 : 41
A运行 : 43
B运行 : 42
A运行 : 44
B运行 : 43
A运行 : 45
B运行 : 44
A运行 : 46
B运行 : 45
A运行 : 47
B运行 : 46
A运行 : 48
B运行 : 47
A运行 : 49
B运行 : 48
B运行 : 49
state TERMINATED
state TERMINATED
state TERMINATED
state TERMINATED

Process finished with exit code 0
而thread1和thread2都是子线程它们并不会等join结束后在执行而是争抢着执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值