多线程

Huxzhi大约 2 分钟

并发与并行

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以我认为它们最关键的点就是:是否是『同时』。

进程概念

  • 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
  • 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

线程调度

  • 分时调度 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
  • 抢占式调度 优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。 设置线程的优先级

Thread-创建多线程的方法

  1. 继承Thread类

//1)定义继承Thread
public class SubThread extends Thread {
    //2)重写run()方法,run()方法体中的代码就是子线程要执行的代码

    @Override
    public void run() {
        for (int i = 1; i < 101; i++) {
            System.out.println("sub thread : " + i);
        }
    }
}
  1. 实现Runnable接口
//1)定义Runnable
public class Prime implements Runnable {
    //2)重写run()方法,run方法体就是用户线程执行的代码
    @Override
    public void run() {
        //在子线程,打印100行字符串
        for (int i = 1; i < 101; i++) {
            System.out.println("sub thread : " + i);

        }
    }
}



3.匿名内部类

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName() + "-->" + i);
                }
            }
        }, "t1");
        //通过构造方法指定线程名称
        t1.start();