Java多线程学习

Java多线程学习

一、Thread类常见API

  1. 创建线程

    1. 继承Thread类,重写run方法

      public class MyThread extends Thread{
          @Override
          public void run() {
              System.out.println();
          }
      }
      
    2. 实现Runnable接口,重写run方法

      public class MyRunnable implements Runnable {
          @Override
          public void run() {
              System.out.println();
          }
      }
      
  2. 启动线程

    实例化线程对象,使用start()方法启动

    Thread thread1 = new MyThread();
    thread1.start();
    
    Runnable runnable = new MyRunnable();
    Thread thread2 = new Thread(runnable);
    thread2.start();
    
  3. i-- 和println()

    1. i--不是线程安全的,赋值操作不是原子性的
    2. println()方法内部是synchronized修饰,所以是可同步的
  4. currentThread()方法和this

    1. currentThread()方法表示执行当点代码段的线程
    2. this表示的是当前对象的线程
  5. 线程A委托线程B执行

    MyThread a = new MyThread();
    Thread b = new Thread(a);
    b.start();
    
    //此时,两者有相同的优先级
    
  6. isAlive()方法

    当前线程是否活动状态

  7. sleep(毫秒)方法

    在毫秒内当前线程暂停执行

  8. getId()方法

    获取线程唯一标识

  9. interrupt()方法

    中断线程,但是不会真的停止,需要配合interrupted()或isInterrupted()方法来判断停止

  10. interrupted()方法

    测试当前线程是否中断,并清除中断状态

  11. isInterrupted()方法

    测试线程对象是否中断,不清除中断状态

  12. 异常停止法,renturn法

    interrupt()中断后,用interrupted()判断,中断,则抛出InterruptedException异常退出,或者使用return退出run方法

  13. 在沉睡种中中断,在中断中沉睡,都会抛出中断异常

  14. stop()方法

    此方法会暴力停止线程,造成释放锁的不良后果

    此方法会抛出ThreadDeath异常,但是通常不需要显式的捕捉

  15. suspend()和resume()方法

    暂停线程和恢复线程

    已经不再使用,因为会造成独占锁和不同步的问题

  16. yield()方法

    放弃当前cpu资源,但是不知道什么时候又会获取cpu

  17. 线程优先级

    1-10,越高优先级越高,优先级高的线程,有可能先执行完毕,但是也不一定,在线程的委托关系中,优先级是共享的

    setPriority()设置优先级

    getPriority()得到优先级

  18. 守护线程

    使用setDeamon(true)来变成守护线程

    守护线程只有在非守护线程全结束时,自己才会自动结束

二、类和变量的并发访问

  1. 实例变量会产生非线程安全问题,因为实例变量是线程间共享的
  2. 局部变量不会产生非线程安全问题,因为在虚拟机栈中,局部变量是线程私有的

。。。。。。等待更新

posted @ 2021-05-08 01:49  那木  阅读(47)  评论(0编辑  收藏  举报