好程序员大数据学习路线分享大数据之线程

  好程序员大数据学习路线分享大数据之线程,默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需要完成自己的功能----创建自己的线程对象

 java将线程面向对象了,形成的类就是Thread,在Thread类内部执行任务的方法叫run()

 注意:如果想让run作为任务区,必须让他去被自动调用.我们通过执行start()方法,来开启线程,继而实现run方法的自动调用.

主线程的名字:main   子线程的名字:从Thread-0开始命名

//创建自己的线程对象

//分析:由于我们实现的实际功能Thread类是决定不了的,所以没有办法将我们的功能放入Thread的run方法里,如果我们想实现自己的功能,可以写Thread类的子类,重写run方法,实现我们的功能.run就是我们的任务区

 

实现多线程的方式两种:

 第一种方式:通过创建Thread子类的方式实现功能----线程与任务绑定在了一起,操作不方便

 第二种:将任务从线程中分离出来,哪个线程需要工作,就将任务交给谁,操作方便

当线程与任务分离后

这里Thread内部默认有一个run,又通过ticket传入一个run,为什么优先调用的是传入的run

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

 

2.线程安全

1、synchronized关键字:

1、synchronized关键字的作用域有二种:

1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;

2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。

2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/区块/},它的作用域是当前对象;

3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;

 

实现线程安全的方式:

1.在代码中使用同步代码块儿(同步锁)

解释:在某一段任务中,同一时间只允许一个线程执行任务,其他的线程即使抢到了cpu,也无法进入当前的任务区间,只有当当前的线程将任务执行完后,其他的线程才能有资格进入

同步代码块儿的构成:

synchronized(锁(对象)){

  同步的代码

 }

对作为锁的对象的要求:

1.必须是对象      

2.必须保证被多个线程共享

可以充当锁的:

1.一个普通的对象      

2.当前对象的引用--this    

3.类的字节码文件 --注意:字节码文件的使用范围太大,一般不建议使用.

同步代码块儿的特点:

1.可以保证线程的安全    

2.由于每次都要进行判断处理,所以降低了执行效率

总结:什么时候使用同步代码块儿

1.多个线程共享一个数据

2.至少有两个线程

 

比较同步代码块儿和同步函数

同步代码块儿使用更加的灵活,只给需要同步的部分代码同步即可,而同步函数是给这个函数内的所有代码同步.

由于处于同步的代码越少越好,所以最好使用同步代码块儿

注意:1.当在一个类中同时存在多个synchronized修饰的代码块儿或函数时,要想安全,就必须让他们后面的对象一致。因为只有同一把锁才能安全。

同步函数的锁:this

2静态同步函数在进内存的时候不会创建对象,但是存在其所属类的字节码文件对象,属于class类型的对象,

所以静态同步函数的锁是其所属类的字节码文件对象

 

示例:

    //使用同步代码块儿

    public void addMoney(int money) {

        synchronized (Bank.class) {

            this.money += money;

            System.out.println(this.money);

        }

    }

    //使用同步函数

    //非静态的同步函数

    //在synchronized后面默认有一个this

    public synchronized void addMoney(int money) {

        this.money += money;

        System.out.println(this.money);

    }

 

 wait():让当前的线程变成等待的状态,放入一个池子(线程容器),失去了抢cpu的能力,.等待唤醒(锁相当于给当前的线程做了一个标记)

notify():让当前的线程从等待状态唤醒,相当于从池子中取出线程.(唤醒的是同一把锁下的任意一个线程)

notifyAll():唤醒的是同一把锁下的所有线程

 

死锁:出现的情况有两种

 1.所有的线程处于等待状态

 2.锁之间进行嵌套调用

 

2.Lock

比较synchronized和Lock

 1.synchronized:从jdk1.0就开始使用的同步方法-称为隐式同步

 synchronized(锁对象){//获取锁      我们将锁还可以称为锁旗舰或者监听器

 同步的代码

 }//释放锁

 2.Lock:从jdk1.5开始使用的同步方法-称为显示同步

 原理:Lock本身是接口,要通过他的子类创建对象干活儿

 使用过程:

 首先调用lock()方法获取锁

 进行同步的代码块儿

 使用unlock()方法释放锁

 使用的场景:

 当进行多生产者多消费者的功能时,使用Lock,其他的都使用synchronized

 使用效率上:Lock高于synchronized

 

线程的停止: 3种

 1.通过一个标识结束线程

 2.调用stop方法---因为有固有的安全问题,所以系统不建议使用.

 3.调用interrupt方法----如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。

 

守护线程:

相当于后台线程.依赖于前台线程.正常情况下,当前台线程结束的时候,不管守护线程有没有结束,都会立刻结束.

 典型的守护线程:垃圾回收线程

 当程序调用setDaemon方法时,并且将参数设置成true.当前线程就变成了守护线层.

 注意:这个方法一定要在start方法之前调用

 thread0.setDaemon(true);

 thread0.start();

 

join()方法:

 

 原理:线程一旦调用了join方法,他的优先级会高于主线程.主线程会等当前的线程执行完后再去执行.

 注意点:优先级只比main线程的高.对其他的线程没有影响.

 当线程开始工作后,让t0调用join方法,让他的优先级高于main线程

 注意:join方法必须在线程开始工作后,执行.

     t0.start();

      try {

          t0.join();

      } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java程序员的发展路线图可以分为以下几个阶段。 阶段一:基础学习和实践 在初期阶段,Java程序员应该学习和掌握Java的基本语法、面向对象编程的概念以及常用的开发工具和框架。同时,通过实践项目来提升自己的编码能力和解决问题的能力。可以参与一些小型项目或者开源项目,积累经验。 阶段二:深入学习和专业化 一旦掌握了Java的基本知识,可以进一步深入学习Java的核心技术,如多线程、网络编程、数据库操作等。同时,可以选择某个特定领域进行专业化学习,例如Web开发、移动应用开发、大数据技术等。学习并掌握相关的工具和框架,提升自己在特定领域的竞争力。 阶段三:架构设计和项目管理 在成为资深程序员之后,可以开始学习和实践项目架构设计和项目管理等领域的知识。这包括设计模式、软件架构、系统集成等方面的知识。此外,还可以学习项目管理的知识,如需求分析、项目计划和团队合作等能力。 阶段四:技术专家和领域专家 达到这个阶段的程序员可以选择成为技术专家或者领域专家。技术专家可以持续学习和研究最新的Java技术,深入研究某个领域的技术难题,提高解决问题的能力。领域专家可以通过了解某个特定领域的业务和需求,结合自己的技术知识,提供解决方案并担任技术顾问的角色。 总结起来,Java程序员的发展路线图是一个由初级到高级、从基础到专业化、从技术到管理的过程。不断学习和实践,在不同阶段选择不同的方向发展,提升自己的技术能力和职业竞争力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值