查看: 2377|回复: 0

[Java语言] java多线程

发表于 2018-1-19 15:09:08
一:线程与进程
进程是程序的一次动态的执行过程。多进程操作系统能同时运行多个进程(程序),由于cpu具备分时机制,所以每个进程都能循环获得自己的cpu时间片段。由于cpu执行速度非常快,是的所有程序好像在同时运行一样。
  线程是比进程更小的执行单位,线程是在进程的基础上经一部划分的。这些线程可以同时存在、同时运行。一个进程可能包括多个同时执行的线程。所谓线程(Thread)是指程序的运行流程,多线程机制则是指可以同时运行多个程序块,使程序运行的效率变得更高。
二:java实现多线程操作有两种方式
继承Thread类,实现Runnable接口。多线程之间是交错运行的。


编译并运行程序后,发现以上程序时先执行完m1对象在执行m2对象,并没有交错运行,也就是说线程实际上并没有被启动,还是属于顺序执行的方式。那么如何启动线程呢?
调用从Thread类继承而来的start()方法。将run()修改为start()就行。
解释:为什启动线程不能直接调用run()方法呢?
因为线程的运行需要本机的操作系统的支持,run()方法属于java虚拟机栈(执行java服务,也就是字节码服务),而start方法(实际上调用的是star0方法)属于本地方法栈(执行native方法服务),native服务适用于本地操作系统。
使用Runnable接口启动多线程


三:线程的状态1创建状态:调用Thread thread = new Thread();线程对象便处于新建状态,此时,它已经有了相应的内存空间和其他资源
2就绪状态:调用start()方法后,线程进入就绪状态,等待cpu服务。
3运行状态:当调用run()方法时,程序进入运行状态,获得了处理器资源

4堵塞状态:
如果调用sleep、suspend、wait等方法,线程进入堵塞状态,只有当堵塞的原因消除之后,线程才可以转入就绪状态


5死亡状态:
线程调用stop()方法或run()方法执行结束后,就处于死亡状态。处于死亡状态的线程不具有运行能力。
四:线程操作的相关方法1取得和设置线程的名称MyThread my = new MyThread();
new Thread(my).start();   //系统自动设置线程名称
new Thread(my,"线程-A").start(); //手动设置线程名称
new Thread(my).start();  //系统自动设置线程名称

然后在main方法里面调用Thread.currentThread().getName()取得当前线程的名称。
得到的结果如下:Thread-0、线程-A、Thread-1


说明:
java至少启动两个线程,一个是main方法(main),一个是垃圾回收线程
2判断线程是否启动isAlive方法判断
3线程的强制运行


使用join方法使线程强制运行,线程强制运行期间,其他线程无法运行。


4线程的休眠

Thread.sleep(500)



5中断线程

当一个线程运行时,另外一个线程可以直接通过interrupt()方法中断其运行状态



程序运行结果:
1、进入run方法
3、休眠被终止

从以上程序可以看出,一个线程启动之后进入了休眠状态,原本是要休眠10秒之后再继续执行,但是主方法在线程启动之后的两秒就将其中断,休眠一旦中断之后将执行catch中的代码,并利用里面的return语句返回程序调用处。
6后台线程
即使java进程结束了,后台线程依然会执行。要想设置后台线程,只需要在start方法之前加上thread.setDaemon(true)就行。
7线程的优先级
thread.setPriority(Thread.MIN_PRIORITY)//设置最低优先级
thread.setPriority(Thread.NORM_PRIORITY)//设置中等优先级

thread.setPriority(Thread.MAX_PRIORITY)//设置最高优先级


8线程的礼让
,可以使用yield()方法将一个线程的操作暂时让给其他线程执行。
五:同步和死锁一个多线程的程序如果是通过Runnable接口实现的,则意味着类中的属性将被多个属性共享,那么这样一来就会造成一种问题,如果这多个线程要操作同一资源时就很有可能出现资源同步的问题。例如以下的买票程序,如果多个线程同时操作时就容易出现票数为负数的情况。


结果:
卖票:ticket = 1
卖票:ticket = 0

卖票:ticket = -1

如果要解决这个问题,则必须使用同步。所谓同步就是指多个操作在同一个时间段内只有有个线程进行,其他线程要等待此线程完成之后才可以继续执行。
如图:


将以上代码做出如下修改,就可以使票数不会出现负数了


使用同步代码块实现格式:
synchronized(同步对象){
需要同步的代码;
}
六:死锁同步可以保证资源共享操作的正确性,但是过多的同步也会产生死锁。所谓的死锁,就是指两个线程都在等待对方先完成,造成程序的停滞,一般的死锁都是在程序运行时出现的
七:线程的生命周期

大部分线程生命周期前面已经讲过,下面说说这三个方法
1 suspend()方法:暂时挂起线程
2resume()方法:恢复挂起的线程
3stop()方法:停止线程

对于这三种方法并不推荐使用,因为这三种方法在操作时会产生死锁的问题。
那么如何停止线程运行呢?

一旦调用stop方法,就会将MyThread类中的flag变量设置为false,这样run()方法就会停止运行,这种停止方法在开发中是比较常用的。
创客学院更多视频尽在:www.makeru.com.cn
java学习交流群:587131012



回复

使用道具 举报