欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程技术的概述

程序员文章站 2022-05-05 22:03:42
...

线程与进程
进程:

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

线程:

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

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

        }

    }
相关标签: java