多线程知识点

这篇具有很好参考价值的文章主要介绍了多线程知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.多线程

多线程知识点,多线程,java,开发语言
多线程知识点,多线程,java,开发语言
例如:一个短视频,一个线程复制管理视频,一个线程负责管理声音,一个线程负责管理弹幕
进程:Process,程序一旦开始运行就是是一个进程
线程:Thread,一个程序运行后,里面就包含了多个线程

真正的多线程是指有多个cpu,即多核。如果是模拟的多线程,即只有一个cpu,在同一时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错误

2.线程的创建

1.继承Thread类
线程不一定立即执行,听从cpu的安排,交替执行

//实现步骤
1.继承Thread
2.重些run方法
3.对象. start()启动线程
public class StartThread extends Thread
{
@Override
public void run()
{
}
}
StartThread a=new StartThread();
a.start()

2.实现Runnable接口
接口实现类对象能被多个线程使用
1.实现接口
2.编写线程方法
3.开启线程,通过实现Runnable接口来创建线程,启动线程时需要通过Thread对象。

PrimeRun p = new PrimeRun(143);
new Thread(p).start();

并发问题:

3.实现Callable接口

3.静态代理

使用步骤
1.需要代理对象、实际对象,以及一个抽象接口
2.代理对象、实际对象都要实现接口
3.代理对象中创建构造方法,方法参数为接口类对象
4.在代理对象中定义抽象接口类对象来接收构造方法的参数对象
5.在代理对象中接口的实现方法中,用接收到的变量接口对象调用实现的接口方法
逻辑,通过代理对象的有参构造,将实际对象以参数的形式传递到代理类中,然后在代理类接口的实现方法中,调用实际类中的实现方法

4.线程停止

1.设立外部标志位,定义一个公开的方法,通过改变标志位来结束进程
多线程知识点,多线程,java,开发语言

5.线程休眠

应用

1.模拟网络延时
通过延时可以发现多线程中出现的问题,如数据同步性
2.倒计时
每个对象都有一把锁,sleep不回释放锁

6.线程礼让

Thread.yield()
正在进行的线程,由运行态转为就绪态,然后由cpu在就绪态中选择另一个线程,礼让不一定百分百成功

7.线程强制执行

线程插队,强制执行插队的线程
多线程知识点,多线程,java,开发语言

8.观测线程的状态

Thread.getState()
线程的状态
1.创建
2.就绪
3.执行
4.阻塞
5.结束,线程一旦结束,就不能再被使用

9.线程的优先级

thread.setPriority()
多线程知识点,多线程,java,开发语言

10.守护线程

监控用户线程,用户线程结束,守护线程也结束
thread.setDaemon()
多线程知识点,多线程,java,开发语言

11.线程同步

并发:同一个对象被多个线程同时操作,如:秒杀,抢票
解决线程的不安全性:队列+锁,解决数据安全性
synchronized

//修饰代码块
synchronized(this){} //修饰当前类
synchronized(类.class){}//修饰其他类
//修饰方法
1.修饰静态方法
2.修饰非静态方法

案例代码:
class Thick implements Runnable
{
    private int num=10;
    Boolean flag=true;


    @Override
    public void run()
    {
        try {
            buy();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public void buy() throws InterruptedException {
        while (flag)
        {
            Thread.sleep(200);
            if (num>0)
                synchronized (this)
                {
                    System.out.println(Thread.currentThread().getName()+"买到了第"+num--+"票");
                }
            else
            {
                flag=false;
            }
        }
    }
    
 public class CarThick {
    public static void main(String[] args) {
        Thick thick=new Thick();
        new Thread(thick,"张三").start();
        new Thread(thick,"李四").start();
        new Thread(thick,"王二狗").start();
    }
}

12.死锁

多线程知识点,多线程,java,开发语言

13.Lock锁

synchronized锁的作用一样,在线程同步的情况下,保证数据的原子性

ReentrantLock//可重入锁
private final ReentrantLock lock=new ReentrantLock();
lock.lock();//加锁,在数据发生改变的地方,加锁
lock.uplock;//解锁,完成数据改动后,把锁给下一个线程

14.生产者与消费者-线程通信

1.生产者
2.消费者
3.线程池
4.消费品

管程法

//线程池
class SynContainer{
    // 需要一个容器大小
    Bug[] bugs = new Bug[10];
    // 容器计算器
    int count = 0;

    // 生产者放入bug
    public synchronized void push(Bug bug){
        // 如果容器满了,就需要等待消灭bug
        if(count==bugs.length){
            // 通知消灭bug者消灭,生产bug等待
            try {
                //导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。
                this.wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 如果没有满,我们就需要继续生产bug
        bugs[count] = bug;
        count++;

        // 可以通知消灭者消灭了
        this.notifyAll();
        // notifyAll唤醒正在等待对象监视器的所有线程。
    }

    // 消灭者消灭bug
    public synchronized Bug pop(){

        // 判断能否消灭
        if (count == 0){
            // 等待生产者生产,消灭者等待
            try {
                this.wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 如果可以消灭
        count--;
        Bug bug = bugs[count];

        // 消灭完了,通知生产者生产

        this.notifyAll();
        try {
            System.out.println("通知生产者");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return bug;

    }
//生产者
class Productor extends Thread{

    SynContainer container;

    public Productor(SynContainer container){
        this.container = container;
    }

    // 生产
    @Override
    public void run() {
        for (int i = 0; i <=100; i++) {
            container.push(new Bug(i));
            System.out.println("生产了"+i+"个bug");
        }
    }
}

//消费者
class Consumer extends Thread{

    SynContainer container;

    public Consumer(SynContainer container){
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            System.out.println("消灭了-->"+container.pop().id+"个bug");
        }
    }
}
//消费品
class Bug{
    int id;// bug编号
    public Bug(int id){
        this.id = id;
    }
}
//测试
public class ProviderAndConsumer
{
    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Productor(container).start();
        new Consumer(container).start();
    }
}

15.线程池

避免重复的创建销毁线程,减少资源浪费,类似于数据库连接池
多线程知识点,多线程,java,开发语言文章来源地址https://www.toymoban.com/news/detail-672060.html

到了这里,关于多线程知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全靠这份Java知识点PDF大全,Java开发者必须收藏的8个开源库

    自我介绍 项目中的监控:那个监控指标常见的有哪些? 微服务涉及到的技术以及需要注意的问题有哪些? 注册中心你了解了哪些? consul 的可靠性你了解吗? consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过? 项目用 Spring 比较多,有没有了解 Spring 的原理

    2024年03月23日
    浏览(46)
  • Android 开发必备知识点及面试题汇总(Android+Java+算法+性能优化+四大组件……),腾讯安卓开发面试

    5.请介绍下 AsyncTask的内部实现,适用的场景是 AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来 执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务, 比如 HTTP 请求,大规模的下载和数据库的更改不

    2024年04月15日
    浏览(65)
  • 面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?

    做 Java 开发的小伙伴,对 wait 方法和 notify 方法应该都比较熟悉,这两个方法在线程通讯中使用的频率非常高,但对于 notify 方法的唤醒顺序,有很多小伙伴的理解都是错误的,有很多人会认为 notify 是随机唤醒的,但它真的是随机唤醒的吗? 带着这个疑问,我们尝试休眠 1

    2024年01月24日
    浏览(50)
  • Linux知识点 -- Linux多线程(三)

    持有锁的线程会频繁进入临界区申请临界资源,造成其他进程饥饿的问题; 这本身是没有错的,但是不合理; 线程同步:就是线程按照一定的顺序,进行临界资源的访问;主要就是为了解决访问临界资源和理性的问题;在保证数据安全的前提下,让线程能够按照某种特定的

    2024年02月11日
    浏览(51)
  • Linux知识点 -- Linux多线程(四)

    一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程

    2024年02月10日
    浏览(50)
  • 【C#】知识点实践序列之Lock的输出多线程信息

    大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第2篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正! 本篇在Lock锁定代码块输出多线程信息,用于判断是否是同一个线程还是不同线程。 上篇

    2024年02月03日
    浏览(48)
  • C语言知识点汇总

    C语言知识点保姆级总结,这不得进你的收藏夹吃灰?! 拖了很久的C语言所学知识的简单小结,内容有点多,第一次总结也可能有错误或者不全面,欢迎随时补充说明! ​ 用不同数据类型所定义的变量所占空间大小不一样,定义的变量不是保存于数据类型中,而是因为只有

    2024年01月23日
    浏览(51)
  • JQuery、JSON、AJAX、XML、IO流、多线程、反射核心知识点详解

    一、什么是JQuery     JQuery是JavaScript的一个框架,对js的封装,使得js简单易学     优点:         1、不用考虑浏览器兼容性问题         2、jquery拥有强大的选择器,简化了js代码         3、jquery提供了很多系统函数,直接调用 二、版本         1.x版本:兼

    2024年02月07日
    浏览(47)
  • c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

    总结:视频中对于多线程讲的非常透彻,从线程基础概念—.net不同版本出现的线程方法—多线程常出现问题—双色球项目实践,每个知识点都有代码实操,受益匪浅。附上学习笔记和实操代码。 视频 线程:程序执行的最小单位,任何操作都是由线程完成的,使用同步时,资

    2024年02月11日
    浏览(59)
  • [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

    本文为2022秋网安学院的自然语言处理课程期末复习知识点整理,水平有限,整理的答案可能有错误或遗漏,欢迎大家指正。 文章的第二部分内容参考了学校学姐的文章,文章写的很好,大家可以关注她: (133条消息) 【一起入门NLP】中科院自然语言处理期末考试*总复习*:考

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包