一、概念
线程是一个程序的多个执行路径,执行调度的单位,依托于进程而存在。多进程是指操作系统能同时运行多个任务(程序)。多线程是指在同一程序中有多个顺序流在执行。
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
二、创建方式
start方法启动线程,run方法是线程执行的动作。
1、继承Thread类
package com.multithread.learning;
/**
*@functon 多线程学习
*/
class Thread1 extends Thread{
private String name;
public Thread1(String name) {
this.name=name;
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + "运行 : " + i);
try {
sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread1 mTh1=new Thread1("A");
Thread1 mTh2=new Thread1("B");
mTh1.start();
mTh2.start();
}
}
2、实现Runnable接口
/**
*@functon 多线程学习
*@author 林炳文
*@time 2015.3.9
*/
package com.multithread.runnable;
class Thread2 implements Runnable{
private String name;
public Thread2(String name) {
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + "运行 : " + i);
try {
Thread.sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
new Thread(new Thread2("C")).start();
new Thread(new Thread2("D")).start();
}
}
三、状态
1、start():启动线程,线程从新建状态->就绪状态,系统会通过分配时间随机运行就绪态线程
2、sleep():睡眠线程,线程从就绪状态(或运行状态)->阻塞状态,时间到后会返回就绪状态
3、wait():挂起线程,线程从就绪状态(或运行状态)->阻塞状态
4、notify()与notifyAll():唤醒线程,通过wait()挂起的线程会从阻塞状态->就绪状态
四、同步和交互
1、线程同步
即线程安全,是为了防止多个线程访问一个数据对象时,对数据造成的破坏。使用synchronized关键字同步方法或代码。注意避免死锁情况。
2、线程交互
生产者和消费者问题。使用Object的notify和notifyAll唤醒线程,wait是线程无期限睡眠。注意:唤醒和睡眠线程要监视的同一个对象,即synchronized锁住同一对象。
五、线程池
Executors静态方法创建线程池和ThreadPoolExecutor构造方法创建,一般使用Executors工厂方法,方便使用。类图继承关系
六、Callable线程
带返回结果的线程callable接口:一般在线程池中使用,返回Future 类,其中存在线程运行情况。
七、锁
Condition将Object监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。 | |
Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。 | |
ReadWriteLock维护了一对相关的锁定,一个用于只读操作,另一个用于写入操作。 |
参考:http://www.cnblogs.com/riskyer/p/3263032.html
https://blog.csdn.net/gf771115/article/details/51682561