线程

1:什么是线程

  线程是app中的一个任务(顺序执行流)

  进程是操作系统的一个任务,开辟了一个独立的内存空间,一个app占用一个进程,一个app中有一个或多个线程。这些线程可以共享这块内存空间的资源。

2:并发

  在计算机中,围观上,多个线程不是同时进行的,而是断断续续的(cpu把时间段分成无数多个小的时间片段,而在一个时间片段中,cpu只能运行一个线程,其他线程处于阻塞状态),而宏观上,看上去像是“同时发生”的,这种情况叫并发。

  并发的优点:提高运行效率

     缺点:有安全隐患

3:线程的状态

      new

       |

       |-start()

       |

      runnable

       |

wait sleep   |

      running

       |

      over

4:线程的创建

  (1)继承Thread类,重写run方法(run方法的作用就是写任务代码)

  (2)实现Runnable接口,重写run方法。还要把Runnable的子类型传入Thread对象中,由Thread对象负责启动线程。

  (3)使用匿名内部类完成线程的创建

5:main方法,是jvm调用的执行程序的入口,也是一个线程。

6:线程的常用API

  (1)getName();获取线程的名称(系统会给每一个线程默认分配个名称)

  (2)getId();获取线程的ID值(系统会给每一个线程分配一个标识符)

  (3)currentThread();是静态方法,获取当前所处的线程

  (4)sleep(long time);静态方法,使当前线程进入阻塞状态多少毫秒(让出时间片段),超出time时间,自动进入runnable状态,在time时间内,可能会被打断,会出现打断异常。

  (5)interrupt();打断线程(谁调用,谁就会被打断)线程只有处在睡眠状态时,才会被打断。

  (6)yield();使线程回到runnable状态,让出当前的时间片段。

  (7)join();线程同步

7:线程安全问题

  当多个线程同时访问某一处资源时,会发生线程安全问题。

  这类资源可以是(1)静态资源(2)实例属性

  我们应该让多个线程异步访问这个资源变成同步访问这个资源。

  异步:多个线程“同时运行”,自己干自己的。

  同步:多个线程要按照顺序,一个访问完,另一个才能访问。

  

  锁机制:关键字synchronized(同步),java语言可以为某一块代码提供一个内置锁。

  格式:synchronized(锁对象){
       代码块

     }

  当某一个线程执行到此代码时,会获取一个内置锁,将此代码从里面上锁,其他线程碰到此代码时,需要等待正在运行的线程运行完这个代码块后(会释放内置锁),才可以获取内置锁对象。

  锁:java的任何对象都可以作为锁对象,但是必须保证多个线程使用的是同一个锁,如果锁不是同一个,那么解决不了线程安全问题。

  可以对方法进行直接加锁机制,有锁,锁是类对象(获取类对象的方法:类名.class,类对象是唯一的)。

  在使用锁机制时,要主要效率,锁入的代码越少效率越高。

  静态方法和动态方法在使用锁机制时,不互斥(不会影响)。

  静态方法的锁对象时类对象。

  动态方法的锁是对象。

8:wait()/notify():作用是协调多线程的工作。

  举例说明:一个线程的运行可以会跟另外一个线程有关系,关系如:线程A要等线程B运行完才可以运行。线程A中要使用锁对象.wait()表示等待(让出cpu片段),线程B运行完时,需要锁对象.notify()通知线程A,可以运行了。

 

posted @ 2018-06-08 14:32  Coding_Now  阅读(157)  评论(0编辑  收藏  举报