java笔记 多线程总结

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

Thread类中的几个常用方法和字段:

     static int MAX_PRIORITY   线程可以具有的最高优先级(10级)。
     static int MIN_PRIORITY   线程可以具有的最低优先级(1级)。
     static int NORM_PRIORITY  分配给线程的默认优先级(5级)。

     void setPriority(int newPriority)  更改线程的优先级(就是更改线程的执行频率但不会停止线程)。 

     String getName()   返回该线程的名称。

     void setDaemon(boolean on)   将该线程标记为后台线程(不标记为前台线程,前台线程都结束后,后台线程会自动结束,此时jvm退出)。

     String toString()  返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

     static void yield()  暂停当前正在执行的线程对象,并执行其他线程(作用是不至于某个线程的执行频率过高)。

实现多线程的方法:

1.继承Thread类

         1.定义类继承Thread类

          2.复写Thready类中的run方法(此方法类似于main方法,类似于是线程的入口)

                        目的:将自定义代码储存在run方法中,让线程运行

          3.调用线程的start方法(这种方式才是真正去使用一个线程,调用run方法的话相当于普通方法调用)

                        这个方法有两个作用:1.启动线程,2.调用run方法

2.实现Runnable接口  

    相比较而言,实现Runable方法要比直接继承Thread类要好,因为这样可以避免继承带来的单根性问题

          1.定义类实现Runnable接口

          2.覆盖Runnable接口中的run方法

                       目的:将自定义代码储存在run方法中,让线程运行

          3.通过Thread类建立线程对象(即创建上述类的对象,当成Thread类的构造函数的参数(就是下一步的操作)即可)

          4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数

                        因为run方法所属的对象时Runnable接口的子类对象,所以要让线程去运行指定对象的run方法,就必须要明确该run方法所属的对象

          5.调用Thread类额start方法开启线程并调用Runnable接种子类的run方法

线程的运行状态:

1.被创建

2.运行start()

3.冻结  睡眠sleep()   等待wait()

4.唤醒notify()

5.消亡stop()

多线程的安全性:

   当run方法中有多条执行语句时,多条线程可能带来的问题:一个线程执行了一句语句,剩下的还没执行,

    由于cpu的切换就可能导致其他线程进来执行,同样的其他线程也可能暂时被停止,这样就会带来安全隐患。

 解决方法:

               使操作共享数据的多条语句(单条语句的话不会引起安全问题)同步即可

                       因为进入被同步修饰的代码块的线程会被锁定,执行完操作之后才能被释放,这样就能实现多线程的安全性,但是性能会下降

                    多块代码都被同步(都操作同一个共享数据)时,多个synchroized需用同一个锁

                实现方式:

               1.使用synchroized()

                          {

                                  需要被同步的代码块

                          }

                2.使用同步synchroized关键字修饰需要被同步的函数即可,synchroized关键字的位置位于返回值之前

                   普通synchroized方法中的锁是this,即当前对象的引用

                   静态synchroized方法中的锁是类名.class

死锁:

          同步内部嵌套同步,但是用的不是同一个锁,就会造成死锁

线程间的通讯:

         对同一资源同时进行类似于”进和出“的操作,此时为了保证安全性,要对进和出都进行同步,可以用操作的那个唯一的资源充当锁来保证锁的唯一性

等待唤醒:

  等待 wait();和唤醒notify()、notifyall()都在同步中,因为这些操作的前提是其必须拥有锁

强制唤醒:

   void interrupt()  强制唤醒线程。但会抛出异常InterruptedException

加入线程:

  join()当A线程执行到了B线程的.join()方法时,A就会等待。等B县城都执行完之后A才会继续执行,多用于临时独占CPU

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值