Java 多线程相关学习总结

Java多线程学习总结

线程和进程概念

多线程三大特性:原子性,可见性,有序性

  • 进程是独立的应用程序,进程中一般会有多个线程,进程是线程的集合。
  • 线程就是一条执行路径。
  • 多线程目的为了提高程序效率。

并发:两个队伍交替使用一台CPU

并行:两个队伍同时使用两台CPU

多线程创建方式

继承Thread类

class ThreadDemo1 extends Tread{
  @Override
  public run(){
      while(true){
          System.out.println("TreadDemo1");
      }
  }
}
TreadDemo1 t = new TreadDemo1();
t.start();

实现runnable接口,重写run方法

class ThreadDemo2 implements Runnable{
  public void run(){
      while(true){
          System.out.println("ThreadDemo2");
      }
  }
}
Thread t = new Thread(new ThreadDemo2());
t.start();

使用匿名内部类

Thread t = new Thread(new Runnable(){
  public void run(){
      while(ture){
          System.out.println("ThreadDemo3");
      }
  }
})
t.start();

多线程的状态类型

多线程大致包含五个主要状态:

  • 新建状态:创建好线程,没有调用start方法之前。
  • 就绪状态:等待cpu分配执行权。
  • 运行状态:执行run方法代码。
  • 死亡状态:run方法执行完毕后,一个未捕获异常终止了run方法使线程猝死。
  • 阻塞状态:wait、sleep方法,锁资源被其他线程抢断等。

join()方法使用示例

join()让其他线程变为等待。把指定的线程加入当前线程,可以让两个交替执行的线程合并为顺序执行的线程。比如线程B调用了线程A的join()方法,直到线程A执行完毕后,才会执行线程B。

/**
 *示例:子线程执行完毕后,主线程才能执行
 */
Thread t1 = new Thread(new Runnable() {

          @Override
          public void run() {
              for (int i = 0; i < 10; i++) {
                  try {
                      Thread.sleep(10);
                  } catch (Exception e) {

                  }
                  System.out.println(Thread.currentThread().getName() + "i:" + i);
              }
          }
      });
      t1.start();
      // 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
      t1.join();
      for (int i = 0; i < 10; i++) {
          try {
              Thread.sleep(10);
          } catch (Exception e) {

          }
          System.out.println("main" + "i:" + i);
      }

线程优先级设置

在JAVA线程中,通过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5。

Thread t = new Thread(new ThreadDemo());//创建线程t
t.setPriority(10);//将线程优先级设为10
t.start();//执行线程

线程安全相关

线程安全问题产生原因

当多个线程共享同一个全局变量,在写的操作时,可能会受到其他线程的干扰。

线程安全问题解决办法

  1. 内置锁(Synchronized):保证线程原子性,当线程进入方法时,自动获取锁,一旦锁被其他线程获取到后,其他的线程就会等待,只有一个线程进行使用。程序执行完毕后就会把锁释放。但是它会降低程序的运行效率(锁资源的竞争)。
  2. 显示锁(Lock锁)

CAS

  • CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
  • 它是整个JUC的基础

本博客所有文章除特别声明外,大部分为学习心得,欢迎与博主联系讨论