【java--线程】Java线程基础

很不严谨的说,线程是什么?线程就是为了让很多个东东并发执行,大大的提高程序执行的效率啊

三个非常重要的概念:

  • 程序:一组写好了的静态代码块(就我们写的那些代码玩意)
  • 进程:正在进行着的程序,即静态的代码执行起来了
  • 线程:是进程的小单元,或者说多个线程构成一个进程(线程的出现是因为进程满足不了人们的需求,于是进程被细化了)

线程的转换(五个较为简单的转换)可以通过这个图了解一下:
【java--线程】Java线程基础_第1张图片


在Java中,如何实现线程呢?

线程是操作系统层次的(又或者说是cpu层次的,进程怎么执行的,顺序是啥。。。这些都是靠cpu分配的)
不过线程怎么去用,Java的jdk里面已经给我们写好了

【java--线程】Java线程基础_第2张图片

实现线程的过程(有两个方法):

  1. 自己描述一个类
  2. 实现线程的两个前提条件(继承Thread是最方便的,但是Java是单继承的,很可能会和其他的继承冲突;所以还可以通过实现Runnable接口,不过它要额外的通过写一个Thread类来执行start()方法):
    方法一:继承一个父类Thread
    方法二:实现一个接口Runnable
  3. 我们都必须重写run()方法,
    因为这个方法来源于cpu,是操作系统给jdk提供的接口,jdk将它包装成run(),其实我们执行的线程就是写在run()方法中的代码执行起来了
  4. new一个线程对象(我们是无法调用run()的,它只有cpu才可以调用,cpu分配时间碎片才能开始执行)
    我们只能调用start()方法(这个方法继承自Thread),它会使这个线程除了cpu资源的其它资源都得到满足,让它进入就绪状态,在就绪队列中等待着cpu执行它

(补充:为什么要这么麻烦呢?为什么不直接使用Thread类或者Runnable接口,直接在里面写线程的代码,但是run()方法是不允许有参数的啊,我们一般要执行的线程都要传参数,所以只能通过继承和实现来解决参数传递的问题)

线程有三类:

  1. 主线程:系统线程,如Java中的Java虚拟机(主线程是最先执行的)
  2. 用户线程:Java中main函数执行的那些玩意
  3. 守护线程(精灵):比如Java中的GC(垃圾回收器,他是为主线程服务的,当系统启动后,GC就随之产生了;Java虚拟机断掉了,GC也就不干活了)

写一个小例子,看一下线程的执行是个随机的(全靠操作系统如何调度和分配资源,jdk是不能影响它的)

package thread_test;

public class Running extends Thread {
    String name;

    public Running(String name){
        this.name = name;
    }

    @Override
    public void run() {
        for(int i = 1; i <= 5; i++){
            System.out.println(name + "跑到了" + i + "米");
        }
    }

    public static void main(String[] args) {
        Running Lux = new Running("Lux");
        Running Ahri = new Running("Ahri");
        Running Annie = new Running("Annie");
        Lux.start();
        Ahri.start();
        Annie.start();
    }
}

第一次运行:
【java--线程】Java线程基础_第3张图片
第二次运行:
【java--线程】Java线程基础_第4张图片
。。。
显然,线程无论执行顺序,还是开始执行时间都是随机的(这是在在我们看来,而实际上操作系统怎么调度这些线程是有其自己的算法的)


上面的代码,线程的实现是通过继承Thread实现的;
而怎么通过实现Runnale接口来实现线程呢?其实也差不多,就是多写点东西:

package thread_test;

public class Running implements Runnable {
    String name;

    public Running(String name){
        this.name = name;
    }

    @Override
    public void run() {
        for(int i = 1; i <= 5; i++){
            System.out.println(name + "跑到了" + i + "米");
        }
    }

    public static void main(String[] args) {
        Running Lux = new Running("Lux");
        Running Ahri = new Running("Ahri");
        Running Annie = new Running("Annie");

        Thread thread1 = new Thread(Lux);
        thread1.start();
        Thread thread2 = new Thread(Ahri);
        thread2.start();
        Thread thread3 = new Thread(Annie);
        thread3.start();
    }
}

你可能感兴趣的:(Java)