黑马程序员--------------多线程
来源:互联网 发布:linux切换输入法 编辑:程序博客网 时间:2024/05/12 22:08
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、进程与线程
一个进程就是一个应用程序,一个进程里面有多个线程。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序运行效率。
二、多线程的实现方式 继承Thread类
1.代码格式
class
类名
extends
Thread{
方法
1
;
方法
2
;
…
public
void
run(){
//需要多线程执行代码。
}
}
start()1.开启线程,2开启的线程执行run方法。
run() 没有开启线程,主线程执行run方法。
三、程序运行状态图
什么时候结束线程,只有run()方法结束了,当前线程就结束了。
四、多线程的实现方式 实现接口Runnable
1. 实现Runnable接口,然后用new Thread(实现Runnable接口的类的对象)来产生一个线程类。
class
类名
implements
Runnable{
方法
1
;
方法
2
;
…
public
void
run(){
// other code…
}
属性
1
;
属性
2
;
}
代码实例
class Tick implements Runnable{ private int sum = 100 ; private Object o = new Object(); public void run() { while(true) { synchronized (o){ if(sum>0) { try{ Thread.sleep(1); } catch ( InterruptedException e){ new RuntimeException("不认识您"); } System.out.println(Thread.currentThread().getName()+"----------"+sum--); } else break; } } }}public class ThreadDemo { public static void main(String[] args) { Tick t = new Tick(); Thread t1 = new Thread( t ); Thread t2 = new Thread( t ); Thread t3 = new Thread(new Tick()); Thread t4 = new Thread(new Tick()); t1.start(); t2.start(); }}
五、Thread和Runnable的区别:
1.避免了但继承的局限性,
2.如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
3.降低了耦合性,提高了代码了扩展性。
六、多线程的安全问题
1.线程任务中有处理的共享数据,
2.线程任务中有多条对共享数据的操作。
如何解决?
只要保证共享数据的代码在某一时间段,只能被一条线程所执行,在执行期间不允许其他线程参与运算。
可以使用同步函数,同步代码块。
好处:解决了多线程的安全问题,
弊端:降低了效率。
七、同步函数使用的锁(this)和static同步函数的锁是(类名.class)
同步函数和同步代码块的区别.
同步函数使用固定的锁this。同步代码块可以使用任意对象的锁。
class SaleTicks implements Runnable{ private int tick = 1000; public boolean falg = true; public void run(){ if(falg){ while( true ) { synchronized (this) { if( tick>0 ) { try{ Thread.sleep(1); } catch ( InterruptedException e) { new InterruptedException(" ---------"); } System.out.println(Thread.currentThread().getName()+"---fun00---"+tick--); } } } }else{ while(falg==false) sale(); } } public synchronized void sale(){ if( tick>0 ) { try{ Thread.sleep(5); } catch ( InterruptedException e) { new InterruptedException(" ---------"); } System.out.println(Thread.currentThread().getName()+"---222---"+tick--); } }}public class ThisLockDemo { public static void main(String[] args) throws InterruptedException{ SaleTicks st = new SaleTicks(); Thread t1 = new Thread(st); Thread t2 = new Thread(st); t1.start(); Thread.sleep(10); st.falg = false; t2.start(); }}
八、线程池
1、线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;如果线程少了会浪费系统资源,多了又会造成系统拥挤效率不高。用线程池控制线程数 量,使得其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有任务等待进程,则线程池中的线程处于等待。
2、、为什么要用线程池
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。也可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
3、线程池的原理
其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。
1、线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;如果线程少了会浪费系统资源,多了又会造成系统拥挤效率不高。用线程池控制线程数 量,使得其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有任务等待进程,则线程池中的线程处于等待。
2、、为什么要用线程池
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。也可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
3、线程池的原理
其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。
0 0
- 黑马程序员 多线程
- 黑马程序员:多线程
- 黑马程序员-java多线程
- 黑马程序员--java 多线程
- 黑马程序员_java多线程
- 黑马程序员-java多线程
- 黑马程序员_多线程
- 黑马程序员 多线程
- 黑马程序员_JAVA多线程
- 黑马程序员—多线程
- 黑马程序员- 多线程
- 黑马程序员_多线程
- 黑马程序员--多线程
- 黑马程序员_多线程
- 黑马程序员--Java多线程
- 黑马程序员---多线程
- 黑马程序员__多线程
- 黑马程序员_多线程
- oracle入门之 其他对象
- [Leetcode 205, Easy] Isomorphic Strings
- 如何强制去除xcode的编译警告
- 递归资料1
- LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- 黑马程序员--------------多线程
- 工作中写到的一份根据VO或者map对象生成xml格式的字符串参数
- JXL基本操作
- 每天三道冲刺工作--在二元树中找出和为某一值的所有路径
- LeetCode 17 Letter Combinations of a Phone Number 数字转为字母组合
- 递归结束的条件
- 关于java,servlet中的服务器端跳转和客户端跳转
- ToolBar与AppcompatAcitivity实现浸入式Statusbar效果
- 【搭建php环境】注意事项