学习线程笔记

线程与进程:
//进程是内存中运行的应用程序,不同进程不同内存空间
!!可以视作一个软件(应用程序)
//线程是进程中一个执行路径,共享内存空间,并发执行
一个进程最少有一个线程,是进程基础之上进一步的划分
!!可以视为软件的执行路径

每一个线程都有自己的栈空间,公用一个栈内容

线程的调用:
1、分时调度,平均分配每个线程占用CPU
2、抢占式调度,
优先让优先级高的线程使用CPU,相同随机,(java调度)
实际上不能提高程序的运行速度,但能提高程序运行效率
让CPU使用率更高

同步与异步:
//同步:排队执行,效率低但最安全
//异步:同时执行,效率高但数据不安全

并发与并行:
//并发:两个或多个事件在同一时间段内发生
//并行:两个或多个时间在同一时刻发生(同时发生)

Thread线程类:
线程分类:
1-用户线程:当一个进程不包含任何存货的用户线程时结束
2-守护线程:守护用户线程,当最后一个用户线程结束
       所有守护线程自动死亡

创建方法:new...(传任务,可传可不传名称)
方法:
.get()//
.set()//
.get/set name()//获取线程名字
.get/set Daemon()//守护线程,依附于用户线程的子线程
.get/set project ()//设置优先级
.wait()//生产者和消费者,需要先生产再消费,消费完再生产
.sleep(毫秒)//暂停线程
.start()//开始线程
.stop()//已过时,不适用,外部结束并不合理
.currentThread()//获得当前线程
.interput()//线程中断标记,
      可以再try catch直接用return结束

线程阻塞:(可以理解为耗时操作)
线程中断:每个线程都是独立的执行路径,
    是否结束应由自身决定
早期中断使用stop,但外部结束会出现异常,造成垃圾堆积

线程安全与线程不安全:
解决方案:

1、线程安全1-同步代码块(隐)
    创建格式:
    //注意不要一百个对象加一百个锁,锁放外面
    Object o = new Object();
    synchronized(锁对象o){}
2、线程安全2-同步方法(隐)
    创建方法:
    在类中将修饰符设定为synchronized,则锁为this
    如果修饰符是原本是static,则锁为Ticket.class
3、线程安全3-显式锁(显)
    创建方法:
    Lock lock = new ReentrantLock();
    方法:
    lock.lock();//锁上
    lock.unlock();//解除锁定
4、公平锁和不公平锁
    上面三种都是不公平锁
    公平锁创建方式:new ReentrantLock(true);

5、线程死锁
(线程a在等线程b,线程b在等线程a)罪犯与警察
避免方法:
在一个有锁的方法里,不要调用有可能产生锁的方法

6、多线程通信问题(生产者和消费者)
在类中加一个Boolean类型,
在方法前后改Boolean,this.notifyAll()+this.wait

7、线程的六种状态:
    new未启动    Runnable虚拟机运行中
    Blockes被阻塞等待        Waiting无期限等待
    tineWaiting指定     Trainated已退出

Thread:继承extend Thread
创建方法:new
需要实现run方法,是新的执行路径,
不是调动run方法,实际上是调用start()方法
线程运行过程:
程序启动-main线程启动-main方法执行-创建m对象(m线程开启)

Runnable:实现implement Runnable
实现run方法,用于给线程分配任务
创建方法:
先创建对象,再new Thread,再分配给Thread(对象)

实现Runnable和继承Thread相比:
优势在于,
1、通过创建任务,然后给线程分配的方式实现多线程,
更适合多个线程同时执行相同任务的情况
2、可以避免单继承所带来的局限性
3、任务与线程本身是分离的,提高程序的健壮性
4、后续学习的线程池技术,接受Runnable类型的任务,
不接受Thread类型的任务

Callable: 实现Callable<>有返回值的线程

Executors线程池:四种(容纳多个线程的容器)
1、缓存线程池
ExecutorService service = Executor.newCachedThreadpool();
方法:
.excute();
//重复使用线程

2、定长线程池 
.newFixedThreadpool(长度);

3、单线程线程池
.newSingleThreadExecutor();

4、周期定长线程池
(定时执行任务、时长数字、时长数字的时间单位TimeUnit常量指定)
创建方法:
ScheduExcutorService S = Executors.newScheduledThreadPool();

Lambda:Lambda表达式
(面对对象:创建对象调用方法,解决问题)
(函数式编程思想:直接调用函数)
创建方法:
Thread t = new Thread((对象)-> { sout ; } ) ;
//大括号可以省略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值