线程基础知识

程序

是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码。

进程

  1. 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间。
  2. 进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

线程

  1. 线程由进程创建的,是进程的一个实体。
  2. 一个进程可以拥有多个线程。
  3. 单线程:同一个时刻,只允许执行一个线程。
  4. 多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件。
  5. 并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。

  6. 并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行。并发和并行可以同时存在。

线程基本使用

在java中线程来使用有两种方法:

  1. 继承Thread类,重写run方法。
  2. 实现Runnable接口,重写run方法。

应用案例1—继承Thread类

public class thread01 {
    public static void main(String[] args) {
        //启动一个进程,会先进入主线程 (main线程)
        //创建Cat对象,可以当做线程使用
        Cat cat = new Cat();
        cat.start();//启动线程 -> 最终会执行cat的run方法
        cat.run();//run方法就是一个普通的方法,没有真正的启动一个线程,就会把run方法执行完毕,才         向下执行
        //说明:当main线程启动一个子线程 Thread-0,主线程不会阻塞,会继续往下执行。
        //这时,主线程和子线程是交替执行

        /* start源码解读
          (1)
          public synchronized void start() {
             start0();
              }
          (2)
           start0()是本地方法,是JVM调用,底层是c/c++实现
           真正实现多线程的效果,是start0(),而不是run()
           private native void start0();
        */
    }
}

//通过继承thread类创建线程
//1、当一个类继承 Thread类,该类就可以当作线程类使用
//2、重写run方法,写上自己的业务代码
//3、run Thread类,实现了 Runnable接口的run方法
class Cat extends Thread{
    int times = 0;
    @Override
    public void run() { //重写run方法,写上自己的业务逻辑
        while (true) {
             //该线程每隔1秒。在控制台输出“瞄瞄,我是小猫咪"
            System.out.println("瞄瞄,我是小猫咪" +(++times));//让该线程休眠1秒ctrl+alt+t
            try {
               Thread.sleep(1000); //一千毫秒
            }catch (InterruptedException e) {
              e.printStackTrace();
            }
        if(times == 4) { //当times到4,退出while,这时线程也就退出.
            break;
            }
        }
    }
}

应用案例2—实现Runnable接口 

public class thread02 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        //dog.start(); 这里不能调用start
        //创建Thread对象,把dog对象(实现Runnable),放入Thread
        Thread thread = new Thread(dog);
        thread.start();
    }
}
class Dog implements Runnable{ //通过实现Runnable接口来开发线程
    int count=0;
    @Override
    public void run() { //普通方法
        while (true)
        {
            System.out.println("小狗"+(++count)+Thread.currentThread().getName());
            //休眠一秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (count == 10) break;
        }
    }
}

继承Thread vs 实现Rtnnable的区别

  1. 从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口。
  2. 实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制,建议使用Runnable。

多线程机制

当启动一个进程,进程会启动一个主线程,主线程里面会开启若干子线程,当主线程和所有子线程都结束时,进程结束。

你可能感兴趣的:(Java,多线程,java,开发语言)