Java学习--day5

多线程
1、进程和线程
进程是程序的一次动态执行过程,从代码加载到代码执行再到执行完毕。多进程:由于CPU是分时机制,每个进程都是循环获得自己的CPU时间片,但由于CPU执行速度非常快,所以看起来像是进程同时执行。真正可以同时执行的是线程。
线程是比进程更小的执行单位。多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在同时运行。
(例如word,打开word就是运行了一个进程,但在这个进程纸上会运行许多其他的线程,例如单词拼写检查等等。当word关闭了,线程就会消失。但这些线程消失了,word进程不一定消失。
2、多线程的实现
①继承Thread类
一个类只要继承了Thread类,就称作多线程实现类。必须覆写run()方法,这是线程的主体。然后再调用start()方法启动线程。
为何不直接调用run()方法而是start()呢?因为线程的运行需要本机操作系统的支持,而start()方法中正是调用底层的操作系统函数。
②实现Runnable接口
Runnable接口中只定义了一个抽象方法就是run(),所以需要实现run()方法。
但Runnable接口中并没有start()方法,所以还得用到Thread类,通过Thread的构造方法接收Runnable的子类。
例:
My my = new My("线程A");
Thread t = new Thread(my);
t.start();
3、Thread类与Runnable接口
两者关系:实际上Thread类是Runnable接口的子类。Thread类中的run()方法只是调用了Runnable接口的run方法。所以要通过继承Thread类实现多线程,必须覆写run()方法。
两者区别:继承Thread的子类不适合于多个线程共享资源。而实现Runnable接口可以方便地实现资源共享。
实现Runnable接口对于继承Thread类有几个显著的优势:
①适合多个相同程序代码处理同一资源
②可以避免Java单继承带来的局限性
③增强了程序的健壮性,代码能被多个线程共享,做到代码和数据独立
所以开发中建议用Runnable接口。
4、线程的状态和相关操作
线程状态
①创建状态:Thread t = new Thread()
②就绪状态:调用start方法启动,线程进入就绪状态,进入线程等待队列
③运行状态:调用run方法
④堵塞状态:当被人为的挂起或者需要进行耗时的输入输出操作。调用sleep()、suspend()、wait()等方法进入堵塞状态。当堵塞状态消失了,才能进入就绪状态
⑤死亡状态:调用stop()方法或者run()方法执行完毕,即处于死亡状态,不能继续运行。

线程相关操作 :操作方法都是Thread类中。getName()取得线程名称,setName设置线程名称。如果没有设置则会自动分配,格式为Thread-X。所以可以看出Thread类中必然有个static类型的属性为线程自动命名。
①isAlive()判断线程是否启动。主线程可能会先执行完,但不会影响其他线程。
②join()让一个线程强制执行,在线程强制运行期间,其他线程无法运行。(会抛出InterruptedException异常,所以需要些在try...catch中)
③Thread.sleep()线程休眠
④interrupt()中断线程运行状态
⑤setDaemon()设置为后台线程,这样即使Java进程结束了,此后台线程依然会继续进行
⑥setPriority(Thread.MAX_PRIORITY/Thread.NORM_PRIORITY/Thread.MIN_PRIORITY)线程权限设置,主方法的权限为中等。但并不是优先级越高就一定先执行,将有CPU调度。
⑦yield()线程的礼让,本线程先暂停,让其他线程先执行。
⑧wait()线程等待。notify()唤醒第一个等待的线程。notifyAll()唤醒所有等待的线程,哪个优先级高,哪个可能先运行。
⑨线程的停止(但Stop()方法一般不用)。所以需要在run()方法中加一个标志位,如while(flag){};再写一个stop()方法,修改flag。
Java程序至少启动两个线程,一个main线程,一个GC线程。JVM相当于一个进程。
5、同步与死锁
同步 :多线程如果是通过Runnable接口实现的,那么类中的属性就会被共享。多个线程操作同一资源时就可能会造成同步问题。例如卖票出现票为负数的情况。
解决方案:
①同步代码块。格式:
synchronized(同步对象){
需要同步的代码;
}
一般都将当前对象(this)当做同步对象。
②同步方法
synchronized 方法返回值 方法名称(参数列表){
}
死锁 :两个线程都在等在对方先完成,造成程序的停滞。
多线程共享同一资源时需要进行同步,以保证资源操作的完整性。但过多的同步就有可能造成死锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值