并发2-Thread和Runnable

1.java xx.class发生了什么:

编写JVMThread.java
public class JVMThread {
    public static void main(String[] agrs){
        for(int i = 0; i < 100000000; i++) {
                System.out.println(i);
        }
    }
}
执行java JVMThread 两次
可以看到任务管理器中(mac-os):  
  501 14810 14798   0  2:44下午 ttys008    0:08.51 java JVMThread
  501 14811 14804   0  2:44下午 ttys009    0:02.73 java JVMThread
由此可见,java JVMThread 启动了两个JVM,其中每个JVM运行一个java程序

如果代码中没有创建多余线程(如上),JVM会启动本身需要的一个主线程,和其他一系列线程(垃圾回收线程等)

2.创建线程的两种方式:

2.1继承Thread,重写run方法,使用start()使用线程

public class MyThread{

    public static void main(String[] args) {
        System.out.println("主线程ID:" + Thread.currentThread().getId());
        TestThread tt = new TestThread("子线程1");
        tt.start();
        TestThread tt2 = new TestThread("子线程2");
        tt2.start();
        TestThread tt3 = new TestThread("子线程2");
        tt3.start();
    }
}
class TestThread extends Thread{

    private String name;
    public TestThread(String name) {
        super(name);
        this.name = name;
    }
    @Override
    public void run() {
// 在此书写线程的执行代码
        System.out.println(name + "子线程ID:" + Thread.currentThread().getId());
    }
}
运行之后,结果为:    

并发2-Thread和Runnable_第1张图片
线程3在线程2之后创建,却更早执行,说明了创建线程并不会阻塞主线程(main),所有的新建线程都在同一起跑线等待获取CPU等资源

2.实现Runnable接口,重写run方法

public class MyThread{
    public static void main(String[] args) {
        System.out.println("主线程ID:" + Thread.currentThread().getId());
        TestThread run = new TestThread();
        Thread t = new Thread(run);
        Thread t2 = new Thread(run);
        t.start();
        t2.start();
    }
}
class TestThread implements Runnable{
    @Override
    public void run() {
// 在此书写线程的执行代码
        System.out.println("子线程ID:" + Thread.currentThread().getId());
    }
}

你可能感兴趣的:(并发)