JAVA笔记 之 Thread线程

 

线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。 线程不只能够共享进程的内存,并且还拥有一个属于本身的内存空间,这段内存空间也叫作线程栈,是在创建线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。
注意:Java中的多线程是一种抢占机制而不是分时机制。抢占机制指的是有多个线程处于可运行状态,可是只容许一个线程在运行,他们经过竞争的方式抢占CPU。java

1、定义一个线程有两种方法:
一、继承java.lang.Thread类,重写run()方法,经过线程的start()方法被JVM自动运行。
public class ThreadTest extend Thread {程序员

@Override
public void run() {
System.out.println("I'm running!");
};多线程

}并发

二、实现Runnable接口,实现run方法,做为线程Thread类的参数并经过start()方法调用。
public class ThreadTest implements Runnable {ide

public void run() {
System.out.println("I'm running!");
};函数

}性能

2、线程的状态
一、新生状态(New):当一个线程的实例被建立即便用new关键字和Thread类或其子类建立一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有本身的内存空间,但该线程并无运行,此时线程还不是活着的(not alive);
二、就绪状态(Runnable):经过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具有了运行条件,但尚未被分配到CPU即不必定会被当即执行,此时处于线程就绪队列; 此时线程是活着的(alive);
三、运行状态(Running):一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行本身的run()方法中的操做,直到调用其余的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;若是在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive);
四、阻塞状态(Blocked):经过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)
五、死亡状态(Dead): 执行run()方法完毕或者异常退出后的状态。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(runtime exception)的异常;处于Dead状态的线程不是活着的(not alive)。优化

3、线程的经常使用属性
一、优先级(priority)
二、thread.sleep()/sleep(long millis)
三、Thread.yield()
四、thread.join()
五、object.wait()
六、object.notify()/notifyAll()
七、synchronized blockspa

4、Thread synchronized
一、非static的synchronized方法
被锁定的是类的对象,在多线程中,这个对象不能被多个线程同时访问,可是所属类的其余对象的此方法不受限制;
若是一个对象有多个非static的同步方法,一旦进入其中一个,就锁定此对象,没法进入其余同步方法
二、static的synchronized方法
因为static的成员不属于类对象,而是属于Class,所以,这里锁定的是Class类,而不是对象,因此若是static和非static的同步方法共存,
没有冲突。可是若是两个static同步方法,不管是不是不一样对象,都是互斥的,由于他们都属于同一个Class类。
三、synchronized同步块
synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块以外的其余代码是能够被多个线程同时访问到的。
注意:被synchronized保护的数据应该是私有的。线程

5、Lock锁
Lock的锁定是经过代码实现的,而 synchronized 是在 JVM 层面上实现的。
synchronized在锁定时若是方法块抛出异常,JVM 会自动将锁释放掉,不会由于出了异常没有释放锁形成线程死锁。可是 Lock 的话就享受不到 JVM 带来自动的功能,出现异常时必须在 finally 将锁释放掉,不然将会引发死锁。
在资源竞争不是很激烈的状况下,偶尔会有同步的情形下,synchronized是很合适的。缘由在于,编译程序一般会尽量的进行优化synchronize,另外可读性很是好,无论用没用过5.0多线程包的程序员都能理解。

ReentrantLockReentrantLock提供了多样化的同步,好比有时间限制的同步,能够被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。可是当同步很是激烈的时候,synchronized的性能一会儿能降低好几十倍。而ReentrantLock确还能维持常态。 Atomic和上面的相似,不激烈状况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。可是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。由于他不能在多个Atomic之间同步。

相关文章
相关标签/搜索