多线程详解

多线程笔记

1.什么是线程?什么是进程?什么是程序?他们有什么关系?

 

  程序:是为完成特定任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象。
  进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,有它自身的产生,存在和消亡的过程。-------生命周期
  线程:进程可进一步细化为线程,是一个程序内部的一条执行路径

  总结:进程指在系统中正在运行的一个应用程序,程序一旦运行就是进程,进程是资源分配的最小单位

  而应用程序中又包含太多的功能要执行,而线程就是用来执行这些功能的最小单位,是CPU处理器分配资源的最小单位,简单点说就是进程之内执行的一个单位执行流。

 

2.多线程执行期间,会引发好多问题,执行顺序,资源抢占,线程饥饿,从而引发高并发问题,并发和并行有啥区别呢?

  并行:多个CPU同时执行多个任务,比如:多个人同时做不同的事 然后再汇总到一块
  并发:同一时刻,CPU分配多个线程访问和处理统一资源的问题,比如 秒杀,抢票

3.线程的生命周期:

  • 新建 :从新建一个线程对象到程序start() 这个线程之间的状态,都是新建状态;
  • 就绪 :线程对象调用start()方法后,就处于就绪状态,等到JVM里的线程调度器的调度;
  • 运行 :就绪状态下的线程在获取CPU资源后就可以执行run(),此时的线程便处于运行状态,运行状态的线程可变为就绪、阻塞及死亡三种状态。
  • 等待/阻塞/睡眠 :在一个线程执行了sleep(睡眠)、suspend(挂起)等方法后会失去所占有的资源,从而进入阻塞状态,在睡眠结束后可重新进入就绪状态。
  • 终止 :run()方法完成后或发生其他终止条件时就会切换到终止状态。

4.创建线程的方法

    一  继承Thread类实现里面的run方法 缺点是容易产生oop单继承局限性,不建议使用

       

//创建线程方式一:继承Thread类,重写run方法,调用start开启线程
//线程开启不一定立即执行,由cpu调度执行
public class testThread1 extends Thread {
@Override
public void run() {
//run方法线程体
for(int i = 0;i<20;i++){
System.out.println("aaaa:"+i);
}
}

public static void main(String[] args) {
// 创建一个线程对象
testThread1 testThread1 = new testThread1();
// 调用start方法
testThread1.start();
for(int i = 0;i<20;i++){
System.out.println("主线程:"+i);
}

}
}

    二 实现Runnable接口 ,重写run方法,但是最后还是要new一个Thread类来进行starter调用

  

public class test {

public static void main(String[] args) {
// 默认
new Thread(new runThread(),"demo01").start();
// lambda简化 默认new 一个新的runnable的线程class
new Thread(()->{
System.out.println("aaaaa");
}).start();
}
}
class runThread implements Runnable {

@Override
public void run() {
System.out.println("我是runnable接口");
}
}

     三 实现Callable接口,Callable的本质,看源码

    

public class test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
thread3 thread3 = new thread3();
    FutureTask 是juc中的一个
        FutureTask<String> stringFutureTask = new FutureTask<>(thread3);
new Thread(stringFutureTask,"demo").start();
System.out.println(stringFutureTask.get());
}


}

class thread3 implements Callable<String>{

@Override
public String call() throws Exception {
return "Callable";
}
}

 

 

posted @ 2021-07-28 16:48  一只小白菜。  阅读(66)  评论(0)    收藏  举报