并发与并行

并发:两个或多个事件在同一时段内发生
并行:两个或多个事件在同一时刻发生(同时发生
image.png

线程(Thread)和进程

进程:一个内存中运行的应用程序
image.png.

线程:进程中的一个执行单元,一个进程至少有一个,可以有多个线程
线程之间互不影响
image.png

线程调度

  • 分时调度:
    轮流使用,平均分配每个线程占用CPU的时间
  • 抢占式调度:
    根据优先级安排,同优先级随机安排,java为抢占式调度,线程优先级可设置

主线程

执行主(main)方法的线程

单线程程序:
只有一个线程,从main开始,从上到下依次执行


创建新线程有两种方法:
①将类声明为Thread的子类,子类重写run方法
image.png

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("run: " + i);
        }
    }
}


    public static void main(String[] args) {
        MyThread mt = new MyThread();
        mt.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("main: " + i);
        }
    }

②声明Runnable接口的类,该类实现run方法
Runnable中无start方法
image.png
image.png
image.png

多线程运行原理

image.png

多线程程序内存图解:

一个start方法会开辟一个栈内存,各个栈内存之间互不影响
image.png

Thread和Runnable的区别

image.png
传递不同的实现类,传递不同的任务
image.png

尽量使用Runnable接口方式

匿名内部类开启多线程

image.png

父类:
wrong!!!
image.png
Yes!!!一定要用start开启线程

        //匿名内部类格式
        new Thread() {
            //重写run方法
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName() + " ");
                }
            }
        }.start();

接口:

        Runnable r = new Runnable() {

            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "1212");
            }
        };
        new Thread(r).start();

or简化

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "231");
            }
        }).start();

waikiki
4 声望2 粉丝