多线程入门

线程并发:通过CPU调度算法,让用户看上去同时执行,实际上,是通过CPU在高速切换,并不是真正的额同时

线程并行:多个CPU实例或者多台机器同时执行一段处理逻辑,这就是真正的同时;

进程:是系统进行资源分配和调用的独立单位,每一个进程,都由它自己的内存空间和系统资源,线程是进程的执行单元,执行路径。

线程优点:可以同时并发的执行多个任务,当程序的的某个功能正在等待某些资源是,此时又不愿意因为等待而造成资源暂停,

那么可以创建其他线程,可以最大限度的降低cpu的闲置时间,从而提高cpu的利用率;


创建线程的方式一:
1.类去继承(extends)Thread 类
2.该类重写Thread类的run方法,并且将线程要执行的代码,存放到run方法中
3.线程对象调用start方法,开启线程,线程会自动执行run方法;

创建线程的方式二
1.存放线程执行代码的类去实现(implements) Runnable接口
2.重写所实现接口的run方法,并将线程执行代码存放在run方法中
3.创建Thread对象,也就是创建线程
4.Thread线程对象调用start方法,启动线程。

两种方式比较:
第一种采用继承的方式,弊端非常明显,该类继承了Thread线程类就无法再去继承其他类了,这样提高了程序的耦合性,第二开发中常用;

三、线程在程序中的几种状态
出生(Thread t = new Thread)--->就绪(t.start()准备执行)--->执行(获得CPU执行权)

执行--->等待(t.wait()):线程处于等待状态,自己醒不了,只能用notify()或者notifyAll()唤醒,处于等待状态的线程会释放CPU执                 行权,同时释放锁资源---->就绪(唤醒了);

执行--->睡眠(t.sleep()):在制定的毫秒数内让当前正在执行的线程休眠(并不是永久),只是暂停执行,它会释放CPU执行权,但                  是并不会释放锁资源,设定的毫秒时间到了,就会脱离睡眠状态
执行--->阻塞,当多条线程存在输入输出时,就会出阻塞状态
执行--->死亡,run方法执行完毕,线程就结束了也就是处于死亡状态

多线程如果操作共享数据的多条语句,就有可能出现数据错乱问题
多线程的同步机制,synchronized同步机制,
public void run( ){
synchronized(lock) { //这就是所谓的锁,开发常用这样方式解决线程同步问题
}



进程死锁
进程因等待资源的时候而睡眠进入等待状态,只有资源到来的时候才会唤醒进入就绪状态,进程死锁就会发生在这个阶段,如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,就会发生进程死锁,也就是进程不同步。

线程不安全情况:
买票卖出第0,-1张;原因当多条语句操作同一个线程共享数据时,(线程睡眠过程中)一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。
解决:对多个操作共享数据的语句只能让一个线程都执行完,在执行过程中,其他的线程不能参与;同步代码块

总结:解决了多线程的安全问题,但是多线程需要判断锁,较为消耗资源。

未完待续。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值