多线程技术的概述
线程与进程
进程:
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程:
是进程中的一个执行路径,共享一个内存空间,线程之间可以*切换,并发执行. 一个进程最少 有一个线程 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分 成若干个线程
线程的调度
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性), Java使用的为 抢占式调度。
CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻, 只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时 刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的 使 用率更高。
同步与异步
同步:排队执行 , 效率低但是安全.
异步:同时执行 , 效率高但是数据不安全.
并发与并行
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻发生(同时发生)。
有两种方法:实现Runnable 与 继承 Thread.
实现Runnable 与 继承 Thread 相比有如下优势:
* 1. 通过创建任务,然后给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况.
* 2. 可以便面单继承所带来的局限性
* 3. 任务与线程本身是分离的,提高了程序的健壮性
* 4. 后续学习的线程池技术,接收Runnable类型的任务,不接受Thread类型线程.
代码如下:
线程中断:
一个线程是一个獨立的执行路径,他是否应该结束,应该由它自身来决定
代码如下
线程:分为守护线程 和 用户线程
用户线程: 当一个进程不包含任何的存活的用户线程时,进程结束
线程守护: 守护用户线程,当最后一个用户线程结束时,所有守护线程自动死亡
代码如下:
线程不安全: 多个线程同时处理,会造成不合理现象
解决方案1. 同步代码块
格式: synchronized(锁对象){}
/注意: 所有线程要看同一把锁才能排队
代码如下
解决方案2. 同步方法
代码如下:
Runnable run = new Ticket();
new Thread(run).start();
new Thread(run).start();
new Thread(run).start();
}
static class Ticket implements Runnable{
private int count =10;
Object o = new Object();
@Override
public void run() {
while(true){
boolean flag = sale();
if (!flag){
break;
}
}
}
public synchronized boolean sale(){
if(count>0){
//卖票
System.out.println("正在准备出票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
System.out.println(Thread.currentThread().getName()+"出票成功,剩余票数:"+count);
return true;
}
return false;
}
解决方案3. 显示锁 Lock 子类 ReentrantLock
代码如下:
Runnable run = new Ticket();
new Thread(run).start();
new Thread(run).start();
new Thread(run).start();
}
static class Ticket implements Runnable{
private int count =10;
//显示锁 l:fair为true就是公平锁
private Lock l = new ReentrantLock(true);
@Override
public void run() {
while(true){
l.lock();
if(count>0){
//卖票
System.out.println("正在准备出票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
System.out.println(Thread.currentThread().getName()+"出票成功,剩余票数:"+count);
}
else{
System.out.println("票已售完");
break;
}
l.unlock();
}
}
上一篇: PHP memcache实现消息队列实例_PHP教程
下一篇: ab测试并发问题 这个结果很差吗