Java线程学习

进程和线程

  • 进程:是程序的一次执行过程,或者是正在运行的一个程序是一个动态的过程:有自己的产生、存在、和消亡的过程(生命周期)

    ​ 进程作为资源分配的单位,系统在运行的时候会给每个进程分配不同的内存区域

  • 线程:进程可以进一步细化成线程,是程序内部的一条执行路径 (安全问题)

    ​ 线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程切换开销小。

    ​ 一个进程可以有多个线程

    ​ 每个线程拥有自己独立的栈 程序计数器

    ​ ## 并行和并发

  • 并行 多个cpu 同时执行多个任务:比如多个人 同时 做不同的事 。

  • 一个cpu 采用时间片 同时执行多个任务 比如秒杀 多个人做同一件事

线程的创建和使用

方式一 继承Thread 类的方式

  1. 创建一个继承Thread 类的子类
  2. 重写thread 的 run() --> 将此线程的执行操作 声明 在 run()中
  3. 创建Thread 类的 子类的对象
  4. 通过此对象 的调用 start (): 1.启动当前线程 2.调用当前线程的run()
//1.创建一个继承Thread 类的子类
public class MyThread extends Thread{

   @Override
   /*
    *2. 重写thread 的 run() --> 将此线程的执行操作 声明 在 run()中
	*/
   public void run(){
       int  t = 100;
       for(int i = 0;i <= t;i++){
    if(i % 2 == 0){
        System.out.println(Thread.currentThread().getName() + ":"+i);
    }
       }
   }
		//3. 创建Thread 类的 子类的对象
 			MyThread t1 = new MyThread();
      		 t1.setName("线程1");
       //4. 通过此对象 的调用 start ():  1.启动当前线程 2.调用当前线程的run()
        	t1.start();

方式二 实现runnable 接口的方式

  1. 创建一个实现Runnable 的类
  2. 实现类去实现Runnable中的抽象方法()
  3. 创建实现类的对象
  4. 将次对象作为参数传递到Thread的构造器中,创建Thread 类的对象
  5. 通过thread 类对象调用 start()

//1. 创建一个实现Runnable 的类
public class Window implements Runnable {
        @Override
        /*2. 实现类去实现Runnable中的抽象方法()*/
    public void run(){
        int  t = 100;
        for(int i = 0;i <= t;i++){
            if(i % 2 != 0){
                System.out.println(Thread.currentThread().getName() + ":"+i);
            }
        }
    }
    }
		 //3. 创建实现类的对象
 		 Window window =new Window();
 		 //4. 将次对象作为参数传递到Thread的构造器中,创建Thread 类的对象
        Thread w5 = new Thread(window);
        //5. 通过thread 类对象调用 start()
        w5.start();

两种方式的对比

​ 开发中 优先选择 runnable 接口

  1. 实现的方式没有类的单继承性的局限性
  2. 实现的方式更适合来处理多个线程的共享数据

联系 :public class Thread implements Runnable

相同点:两种方式 都需要重写 run()方法,将线程要执行的逻辑声明在 run () 中

目前 两种方式 ,想要启动线程 ,都是调用 Thread 类的Start()

线程中常用的方法:

thread.start()
Thread.run()
Thread.currentThread()	//静态方法 返回执行当前的代码
    getName()
    setName()
    yield() //释放cpu的执行权
    jion()  //在线程 a 中 调 线程b,此时线程a进入阻塞状态  直到线程b运行完成 a 才从阻塞状态出来
    stop()
    sleep(long millitime) 	//让当前线程睡眠 指定的毫秒数  在指定的时间内 ,当前的线程是阻塞状态
    isAlive()  // 判断 线程是否存活

线程的通信:

线程中优先级的调用

调度策略

  1. 时间片
  2. 抢占式:高优先级的线程抢占CPU

Java 的调度方法

  1. 同优先级 线程 组成 先进先出 队列 ,时间片 策略

  2. 对高优先级 ,使用优先调度的策略

线程的优先级

MAX_PRIORITY:10
MIN_PRIORITY:1
NORMAL_PRIORITY:5

涉及 的方法

getPriority()
setProiority(int newProiority)

说明

  1. 线程创建时继承父线程的优先级
  2. 低优先级只是调度的概率低 ,并非一定时在高优先级之后才被调用
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页