线程概述

1,多线程的概念
(1)进程:正在运行的程序,系统进行资源分配的单位。
a,单进程:只能运行一个程序 (DOS)
b,多进程:多个程序可以同时运行(Windows)
c,多进程的优点:程序可以充分利用CPU资源
d,一个CPU在同一时间点,只能做一件事情。
(2)线程:是进程中的一条执行路径
a,单线程:如果一个进程中只有一条执行路径,那么这个程序就单线程的。
b,多线程:一个进程中有多条直线路径。
c,多线程的优点:提高程序的使用率
(3)JVM进程是多线程的
主线程---->main
垃圾回收线程
2,多线程的实现方式:2种(掌握)
(1)继承Thread类
a,编写一个类继承Thread
b,重写run方法,实现线程代码
c,创建类对象
d,启动线程:start()
(2)实现Runnable接口 (1,弥补了Java单继承缺点;2,接口方式更适合多个线程处理统一资源的情况,线程和数据进行分离,更好的体现了面向对象的思想)
a,编写类实现Runnable接口,重写run方法
b,创建线程Thread对象,把a传给他
c,启动线程:start()
接口方式获取线程名称的方式: Thread.currentThread().getName();
3,线程的调度
(1)分时调度模型:每个线程均分CPU的时间片
(2)抢占式调度模型(Java默认类型):优先级高的线程,抢到CPU时间片的几率大。
public static final int MAX_PRIORITY 10
public static final int MIN_PRIORITY 1
public static final int NORM_PRIORITY 5
4,线程的控制
(1)线程休眠:sleep(毫秒)
(2)加入线程:join() -------等待该线程结束,才能开始其他线程
(3)礼让线程:yield() --------保证线程和谐运行
(4)后台线程(守护线程):setDeamon(boolean)
(5)线程中断:stop()和interrupt();-------推荐interrupt()方法-------->掌握
5,线程的生命周期
(1)新建:创建了线程对象
(2)就绪:启动了线程,不是里面就会运行,而是:有执行权,没有执行资格
(3)运行:有执行权,有执行资格
(4)阻塞:正在运行的线程,被其他线程抢到了CPU的执行资格
(4)死亡:线程运行结束,线程消亡
新建–>就绪–>运行–>死亡
新建–>就绪–>运行–>[阻塞–>就绪–>运行]–>死亡
6,多线程实现影院售票程序
(1)问题:多线程安全问题
a:相同的票被卖了多次
b:出现0票或负票的情况
(2)产生问题的原因:
a:多线程环境
b: 多个线程操作同一资源
c: 线程代码不具备原子性(线程执行的是多行代码)
判断ticket
打印ticket
自减ticket
(3)使用"同步代码块"解决线程安全问题
a: synchronized(obj){
线程执行的是多行操作共享资源的代码
}
b:obj指的同步代码“锁”
锁可以是任意对象
必须是同一对象,同一把锁
c:同步的弊端:因为多个线程都要进行锁的判断,会额外消耗系统资源,从而降低程序的效率。
(4)使用"同步方法"解决线程安全问题
a:给方法添加synchronized关键字
b:同步方法的锁对象是this
c:静态方法的锁对象时Class
(5)使用"Java提供的Lock接口"来解决线程安全问题
a:创建Lock锁:Lock l = new ReentrantLock();
b:加锁:l.lock();
c:释放锁:l.unlock();
7,死锁问题
(1)死锁产生:
a:同步嵌套
b:多个锁
(2)死锁概念
a:是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象
b:编写代码时应尽量的避免死锁
(3)死锁代码实现
8,线程组的使用
(1)可以给一批线程设置线程组,针对线程组操作。
(2)ThreadGroup
a:创建线程组:new ThreadGroup(name);
b:获取线程组的名称:getName();
c:设置线程组
setMaxPriority(int pri)
setDaemon(boolean daemon)
d:给线程设置线程组:Thread(ThreadGroup group, Runnable target, String name)
9,线程池的使用
(1)线程池的优势:可以极大的提高程序的效率(创建和启动线程比较耗时)
(2)线程池对象
ExecutorService es=Executors. newFixedThreadPool(int nThreads);
es.submit(线程);线程是实现Runnable接口或Callable接口
10,多线程的第三种实现方式
(1)使用前提:需要线程返回结果
(2)实现Callable接口,重写call()方法。
(3)注意:该方式依赖线程池
11,线程间的通信
(1)生产者和消费者
a:数据不匹配的问题
解决:同步代码块
b:多次生产或消费问题
生产者:
有资源,等待,通知消费者消费
没有资源,生产资源
消费者:
有资源,消费
没有资源,等待,通知生产者生产
c:Java提供了“等待唤醒机制”用于解决以上问题(Object)
wait();
notify();
notifyAll();
12,定时器
Timer t=new Timer();
t.schedule(new MyTask(t), 3000,1000);
SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
t.schedule(new MyTask(t), sdf.parse(“2019-01-16 18:03:30”));

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值