多线程编程:
多任务处理有两种类型:
基于进程
基于线程
进程是指一种“自包容”的运行程序,有自己的地址空间;线程是进程内部单一的一个顺序控制流
基于进程的特点是允许计算机同时运行两个或多个程序
基于线程的多任务处理环境中,线程是最小的处理单位
多任务
多进程:
1、进程是一个独立的应用程序
2、独占内存空间
3、不是绝对意义的同时运行,而是CPU在进程间来回的切换
线程:
1、是进程内部独立运行流程
2、一个进程里面的线程是共享内存地址空间
3、不是绝对意义的同时运行,而是CPU在线程间来回的切换(线程所需的开销更少,效率比进程之间切换消耗小,效率高)
实现方式1:
继承Thread类:并覆盖run()方法,相当于线程的main方法,调用start方法才是开启线程
实现方式2:
实现Runnable接口:并实现run()方法,把接口实现类对象交给一个线程对象,然后调用线程对象的start()方法
new一个Thread类把实现了Runnable的类传进去
Thread类start();
1、分配空间
2、开启线程
3、判断是否有实现Runnable接口,如果有调用传入的类的run();如果没有调用自己的run();
线程状态:
5种状态:
1、新建状态:new出Thread对象的时候。
2、就绪状态:调用start()方法,但是在start()方法调用run()方法之前的状态(分配空间、开启线程)。
3、运行状态:开始执行run()方法。
4、死亡状态:当run()方法执行完了(回收资源、关闭线程)
5、运行状态过程中进入中断状态:
造成中断的5种原因:
1、线程优先级的原因(线程没有抢到CPU执行)
优先级: 最大MAX_PRIORITY 10
最小MIN_PRIORITY 1
默认NORM_PRIORITY 5
设置优先级:Thread对象.setPriority(); 对应的get是得到线程的优先级。
优先级高并不是一定被执行完了在执行低的(不一定争夺赢),只是它被CPU执行的几率更高
2、阻塞:
等待一个I/O操作的时候
3、休眠:
Thread对象.sleep(毫秒);
4、等待/唤醒:
当多个线程在争夺CPU的时候某个线程可以主动wait()退出争夺,然后等待另一个线程调用notify()将第一个调用wait()的线程唤醒
notufyAll()是将全部调用wait()的线程唤醒
5、挂起
yield();
强行让一个线程退出CPU的争夺
线程安全:
当多个线程访问同一资源的时候,才会考虑发生线程安全性问题
解决方法:加同步锁
一个线程执行完了,才允许另一个线程进入操作,线程安全,效率低
同步方法:synchronized 同步锁加在资源方法
同步块:在资源的方法不加synchronized修饰,加在run方法内加synchronized(资源对象){资源对象.方法}(适用于资源对象内有多个方法需要同步)
死锁:
当两个或多个线程,同步访问一对相互(循环)依赖的资源的时候,有可能会发生死锁现象。
线程间的通信:wait() - notify() - notifyAll();
只能够写在同步方法或者同步块当中
守护线程:
只有在主线程执行后才会执行, 不会跟主线程抢CPU,主线程结束,守护线程也跟着结束
join():
多任务处理有两种类型:
基于进程
基于线程
进程是指一种“自包容”的运行程序,有自己的地址空间;线程是进程内部单一的一个顺序控制流
基于进程的特点是允许计算机同时运行两个或多个程序
基于线程的多任务处理环境中,线程是最小的处理单位
多任务
多进程:
1、进程是一个独立的应用程序
2、独占内存空间
3、不是绝对意义的同时运行,而是CPU在进程间来回的切换
线程:
1、是进程内部独立运行流程
2、一个进程里面的线程是共享内存地址空间
3、不是绝对意义的同时运行,而是CPU在线程间来回的切换(线程所需的开销更少,效率比进程之间切换消耗小,效率高)
实现方式1:
继承Thread类:并覆盖run()方法,相当于线程的main方法,调用start方法才是开启线程
实现方式2:
实现Runnable接口:并实现run()方法,把接口实现类对象交给一个线程对象,然后调用线程对象的start()方法
new一个Thread类把实现了Runnable的类传进去
Thread类start();
1、分配空间
2、开启线程
3、判断是否有实现Runnable接口,如果有调用传入的类的run();如果没有调用自己的run();
线程状态:
5种状态:
1、新建状态:new出Thread对象的时候。
2、就绪状态:调用start()方法,但是在start()方法调用run()方法之前的状态(分配空间、开启线程)。
3、运行状态:开始执行run()方法。
4、死亡状态:当run()方法执行完了(回收资源、关闭线程)
5、运行状态过程中进入中断状态:
造成中断的5种原因:
1、线程优先级的原因(线程没有抢到CPU执行)
优先级: 最大MAX_PRIORITY 10
最小MIN_PRIORITY 1
默认NORM_PRIORITY 5
设置优先级:Thread对象.setPriority(); 对应的get是得到线程的优先级。
优先级高并不是一定被执行完了在执行低的(不一定争夺赢),只是它被CPU执行的几率更高
2、阻塞:
等待一个I/O操作的时候
3、休眠:
Thread对象.sleep(毫秒);
4、等待/唤醒:
当多个线程在争夺CPU的时候某个线程可以主动wait()退出争夺,然后等待另一个线程调用notify()将第一个调用wait()的线程唤醒
notufyAll()是将全部调用wait()的线程唤醒
5、挂起
yield();
强行让一个线程退出CPU的争夺
线程安全:
当多个线程访问同一资源的时候,才会考虑发生线程安全性问题
解决方法:加同步锁
一个线程执行完了,才允许另一个线程进入操作,线程安全,效率低
同步方法:synchronized 同步锁加在资源方法
同步块:在资源的方法不加synchronized修饰,加在run方法内加synchronized(资源对象){资源对象.方法}(适用于资源对象内有多个方法需要同步)
死锁:
当两个或多个线程,同步访问一对相互(循环)依赖的资源的时候,有可能会发生死锁现象。
线程间的通信:wait() - notify() - notifyAll();
只能够写在同步方法或者同步块当中
守护线程:
只有在主线程执行后才会执行, 不会跟主线程抢CPU,主线程结束,守护线程也跟着结束
join():