多线程概述

简介

  1. 进程与线程

在这里插入图片描述

在这里插入图片描述

线程实现(重点)

在这里插入图片描述

  1. 创建线程方式一

    继承Thread类,重写run方法,调用start()开启线程

    public class createthread extends Thread{
        //线程入口点
        public void run(){
            //线程体
            for (int i = 0; i < 20; i++) {
                System.out.println("run"+i);
            }
        }
    
        public static void main(String[] args) {
            //创建线程对象
            createthread c1=new createthread();
            c1.start();
            for (int i = 0; i < 20; i++) {
                System.out.println("main"+i);
            }
        }
    }
    

注意:线程开启{通过satart()方法开启}不一定立即执行run,而是由cpu调度执行-----不推荐:为了避免oop单继承的局限性

主线程:线程对象创建和开启线程

  1. 实现Runnable方法->重写run方法->参数为实现类的线程调用satrat()-----推荐使用,避免单继承的局限性,方便同一个对象被多个线程使用

public class jion implements Runnable{
public void run(){
for (int i = 0; i < 5; i++) {
System.out.println(“vip”);
}
}

public static void main(String[] args) throws InterruptedException {
    jion s1=new jion();
    Thread s2=new Thread(s1);
    Thread s3=new Thread(s1);
    s2.start();
    s3.start();
    for (int i = 0; i < 10; i++) {
       
        System.out.println("main");
    }
}

}

线程状态

在这里插入图片描述

注意:一旦进入死亡状态就不能再次启动

sleep
  1. 每个对象都有一个锁,sleep不会释放锁
  2. 模拟网络延时能够放大问题的发生性
礼让
  1. 礼让不一定成功,看cpu心情,礼让完了之后进程之间为竞争关系
观察线程状态
  • 线程状态。线程可以处于以下状态之一:

    • NEW
      尚未启动的线程处于此状态。
    • RUNNABLE
      在Java虚拟机中执行的线程处于此状态。
    • BLOCKED
      被阻塞等待监视器锁定的线程处于此状态。
    • WAITING
      正在等待另一个线程执行特定动作的线程处于此状态。
    • TIMED_WAITING
      正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
    • TERMINATED
      已退出的线程处于此状态。

    一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。

  • 线程优先级

  1. 优先级的设定在start()调度前
  2. 获取优先级getpriority(),设置优先级setpriority(int x)
  3. 优先级低只是意味着获得调度的概率低,都是看cpu调度,这可能会产生性能导置的问题
  4. java提供一个线程调度器来监考程序中启动后进入就绪状态的所有线程,线程调度器参考优先级决定应该调度哪个程序来执行。
守护(daemon )线程
  1. 线程分用户线程和守护线程
  2. gvm必须保证用户线程执行完毕,无需等待守护线程执行完毕
  3. 守护线程用于记录操作日志,监控内存,垃圾回收等等

线程同步(重点)

  1. 并发:同一个对象被多个线程同时操作

  2. 由于同一个进程的多个线程共享一块访问空间,带来了访问法冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronzied

    • 其他线程将锁挂起
    • 多线程竞争下,加锁,释放锁会导致较多的上下文切换和调度延时,引起性能问题
    • 优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题
    同步方法
    • 由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提供一套机制,这就是synchronized,
    • 包括sychronized方法:public synchronized void method(){}
    • sychronized方法块:sychronized(obj){对obj 的一些操作},obj为需要增删改查的任意对象
    • 每个对象都对应一把锁,每个sychronized方法都必须获得该方法的对象锁才能执行,否则线程会阻塞,直到锁被释放,才能获得锁,进而执行
    • 一般需要修改的部分才加锁
    • 同步方法默认锁的是this
    • 同步块可以锁任何对象
    • juc安全类型集合
    LOCK锁

    在这里插入图片描述

在这里插入图片描述

线程通信问题

1 wait(),notify(),notifyAll()

线程通信问题

1 wait(),notify(),notifyAll()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值