线程是一个程序的多个执行路径,执行调度的单位,依托于进程而存在。多进程是指操作系统能同时运行多个任务(程序)。多线程是指在同一程序中有多个顺序流在执行。
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含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接口:一般在线程池中使用,返回Future 类,其中存在线程运行情况。
Condition
Condition将Object监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。
Lock
Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。
ReadWriteLock
ReadWriteLock维护了一对相关的锁定,一个用于只读操作,另一个用于写入操作。
参考:http://www.cnblogs.com/riskyer/p/3263032.html
https://blog.csdn.net/gf771115/article/details/51682561