Java并发编程-基础概念全解

1、基础

1.1、什么是进程和线程

  进程和线程都是操作系统所运行的程序运行的基本单元。进程可以说是是线程的集合。
  进程:从系统资源讲,进程都有自己独立的地址空间,一个进程的崩溃不会影响另一个进程的执行。
  线程:进程中的一个执行路径,一个进程中可以同时有多个线程在执行,当其中一个线程对公共资源做了修改,其他线程是可以看到的。

1.2、什么是并行和并发

  并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
  并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

1.3、Java线程基础

1.3.1、如何创建一个线程

  第一种方式:继承Thread类

package com.syw.study.thread;
public class Demo001_Thread extends Thread {
    @Override
    public void run() {
        System.out.println("我是一个线程。。。。。");
    }
    public static void main(String[] args) {
        Demo001_Thread t = new Demo001_Thread();
        t.start();
    }
}

  第二种方式:实现Runable接口

package com.syw.study.thread;
public class Demo003_Thread implements Runnable {
    @Override
    public void run() {
        System.out.println("我是一个实现了Runnable接口的线程.....");
    }
    public static void main(String[] args) {
        Thread t = new Thread(new Demo003_Thread());
        t.start();
    }
}

  第三种方式:匿名类

package com.syw.study.thread;
public class Demo004_Thread{
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是一内部匿名类线程.....");
            }
        });
        t.start();
    }
}

1.3.2、线程的状态

  1、New:创建
  2、Runnable:准备好了
  3、Running:运行
  4、Blocked:阻塞
  5、Dead:死亡

  五种状态之间的关系,如下图:
  

  现在对以上图中12条线分别解释说明:
  1、Thread对象的start()方法,使线程由“新建”状态转变为“可运行状态”, 此状态下,线程在等待CPU资源;
  2、此时线程获得CPU资源,变为“运行”状态,开始执行自己的业务代码,即:run()方法中的代码;
  3、有三种情况,导致线程死亡,一、run()方法结束;二、线程响应Interrupt异常;三、抛出异常;
  4、Thread对象的yield()方法使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程;
  5、6、Thread类的sleep()方法,让线程阻塞指定时间,此时如果它正占有某对象的锁,那么不会释放锁;指定时间一过,线程重新回到运行状态;
     Thread类的suspend()方法,同样也使线程进入阻塞状态,也不会释放锁,只不过需要resume()方法让线程回到运行状态;
  7、8、当前线程调用 XX线程.join() 方法,当前线程进入阻塞状态(当前线程调用了XX线程.wait()方法),直到XX线程执行完毕,当前线程回到Runnable状态(线程运行完毕后会调用自身的notifyAll()方法);
  9、10、当前线程在获得对象锁的情况下,调用该对象的wait()方法,会使用当前线程进入阻塞状态,直到其他线程调用此对象的notify() 或 notifyAll()方法;
  11、12、当前线程遇到synchronized关键字,如果此时锁被占用,则当前线程进入阻塞状态,等待其他线程调用notify() 或 notifyAll()方法,使自己进入Runnable状态,等待获得CPU执行时间;
   

待续更新,敬请期待..........

1.4、线程的协作

...........

2、线程安全

...........

猜你喜欢

转载自www.cnblogs.com/liushengit/p/10015729.html