学习地址
1、进程与线程
1.1、进程
- 当一个程序被运行,就开启了一个进程, 比如启动了qq,word
 - 程序由指令和数据组成,指令要运行,数据要加载,指令被cpu加载运行,数据被加载到内存,指令运行时可由cpu调度硬盘、网络等设备
 
1.2、线程
- 一个进程内可分为多个线程
 - 一个线程就是一个指令流,cpu调度的最小单位,由cpu一条一条执行指令
 
2、并行与并发
并发:单核cpu运行多线程时,时间片进行很快的切换。线程轮流执行cpu
并行:多核cpu运行 多线程时,真正的在同一时刻运行
3、优点
- 程序运行的更快!快!快!
 - 充分利用cpu资源,目前几乎没有线上的cpu是单核的,发挥多核cpu强大的能力
 

4、四种实现方式
- 继承Thread类,重写run方法
 - 实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
 - 通过Callable和FutureTask创建线程
 - 通过线程池创建线程
 
前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果
后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中
4.1、继承Thread类的线程实现
public class ThreadDemo01 extends Thread{public ThreadDemo01(){//编写子类的构造方法,可缺省}public void run(){//编写自己的线程代码System.out.println(Thread.currentThread().getName());}public static void main(String[] args){ThreadDemo01 threadDemo01 = new ThreadDemo01();threadDemo01.setName("我是自定义的线程1");threadDemo01.start();System.out.println(Thread.currentThread().toString());}}
程序结果:
4.2、Runnable接口
通过实现Runnable接口,实现run方法,接口的实现类的实例作为Thread的target作为参数传入带参的Thread构造函数,通过调用start()方法启动线程
public class ThreadDemo02 {public static void main(String[] args){System.out.println(Thread.currentThread().getName());Thread t1 = new Thread(new MyThread());t1.start();}}class MyThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread().getName()+"-->我是通过实现接口的线程实现方式!");}}
程序运行结果:
4.3、通过Callable和FutureTask创建线程
- 创建Callable接口的实现类 ,并实现Call方法
 - 创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值
 - 使用FutureTask对象作为Thread对象的target创建并启动线程
 调用FutureTask对象的get()来获取子线程执行结束的返回值 ```java public class ThreadDemo03 {
/**
@param args */ public static void main(String[] args) { // TODO Auto-generated method stub
Callable
