java基础知识—线程的相关知识理解

线程的相关知识的回顾和理解:

1.什么是进程?

正在执行的程序叫做进程。程序被编写出来之后是静态状态,当执行该程序之后,就会为其在内存中分配一块空间,转变为进程并执行。

2.什么是线程?

进程的执行单位为线程。一个线程独立执行进程中的某一项。

3.进程和线程的区别。

进程中包含线程。一个进程中最少要有一个线程。

4.比较常见线程。

main函数(主线程),gc(垃圾回收线程)

5.创建方式

  1. 继承Thread类,重写run方法
  2. 实现Runable接口,重写run方法
  3. 实现Callable接口,重写run方法

6.启动方式

  • 线程的使用。可以通过new Thread().start()方法来启动。

    如:Thread1 thread1=new Thread1();
          thread1.start();//这是创造新的线程

  • 如果执行start方法,则会在主线程中重新创建一个新的线程,等得到cpu的时间段后则会执行所对应的run方法体的代码。

  •  如果创建了线程对象后,执行run方法,则还是在主线程中执行,会和调用普通方法一样。按照顺序执行。

    如:Thread1 thread1=new Thread1();
        thread1.run();//这是普通方法,还是在主线程中

  • 总结:调用线程的start方法是创建了新的线程,在新的线程中执行。调用线程的run方法是在主线程中执行该方法,和调用普通方法一样,

(注意:线程由start开启不一定立刻执行,由cpu调度执行)

7.线程的状态

线程的状态主要有:新建--就绪--阻塞--运行--死亡

 

 

 

8.线程停止的方法:

不推荐直接使用stop和destory方法。一般让线程自己停止下来或者采用外部标识位。即定义一个boolea值方法,在一定条件下调用该方法,停止线程。

 

 

 9.sleep()和wait()方法

sleep()和wait()方法都是让线程从运行状态转变为就绪状态的方法。

区别:

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
sleep,wait调用后都会暂停当前线程并让出cpu的执行时间,但不同的是sleep不会释放当前持有的对象的锁资源,到时间后会继续执行,而wait会放弃所有锁并需要notify/notifyAll后重新获取到对象锁资源后才能继续执行。

10.守护线程

守护线程独立于正常线程之外执行。虚拟机不需要等待守护线程执行完毕,在正常线程执行结束之后,程序就停止了。

守护线程主要有:gc(垃圾回收线程);内存监控;后台日志记录......

11.线程同步

条件:多个线程操作同一个资源(并发)

对于修改操作的并发可能会造成资源的错误,从而导致线程不安全。因此需要对于修改操作的并发线程进行加锁机制。

12.synchronized和lock

synchronized方法控制对象的访问,每个对象对应一把锁,每个synchroinzed方法必须获得调用该方法的对象的锁之后才可以执行,否则就会处于阻塞状态。其方法一旦执行就会独占锁,直到方法返回才释放,其他线程才能获得这个锁继续执行。(一般加在方法中)

lock:一般实现由ReentrantLock类实现(可重入锁),它有着和synchronized相同的并发性和内存语义。在实现线程安全中一般使用ReentrantLock,因为他可以显示加锁,释放锁。

 

 两种加锁修饰的对比:

 

posted @ 2021-06-05 21:47  SnowBall的博客  阅读(61)  评论(0)    收藏  举报