多线程技术的概述

线程与进程
进程:

是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间

线程:

是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少 有一个线程 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分 成若干个线程

线程的调度
分时调度
所有线程轮流使用 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();

        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值