1、线程和进程
a、并发性(concurrency):在同一时刻只能有一条指令执行,当多个进程指令被快速轮换执行,在宏观上具有多个进程同时执行的效果。
b、并行性(parallel):在同一时刻,有多条指令在多个处理器上同时执行。
c、操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。
d、操作系统支持多进程并发采用的策略有:共享式多任务操作策略(Windows3.1、Mac OS9)、抢占式多任务操作策略(Windows NT、Windows 2000以及UNIX/Linux等)。
2、多线程的优势
a、进程之间不能共享内存,但线程之间共享内存容易;
b、系统创建进程时需要为该进程重新分配系统资源,但创建线程代价小得多,因此使用多线程来实现多任务并发比多进程效率高;
c、Java语言内置了多线程功能支持,而不是单纯的作为底层操作系统的调度方式,从而简化了Java的多线程编程;
3、多线程的应用场景
一个浏览器必须能同时下载多个图片、一个Web服务器必须能同时响应多个用户请求、Java虚拟机本身就在后台提供一个超级线程来进行垃圾回收、图形
用户界面(GUI)应用也需要启动单独的线程从主机环境收集用户界面事件……
4、线程的创建和启动
a、继承Thread类创建线程类
1 /** 2 * @Title: FirstThread.java 3 * @Package 4 * @author 任伟 5 * @date 2014-12-5 下午3:05:49 6 * @version V1.0 7 */ 8 9 /** 10 * @ClassName: FirstThread 11 * @Description: 通过继承Thread创建线程类 12 * @author 任伟 13 * @date 2014-12-5 下午3:05:49 14 */ 15 public class FirstThread extends Thread { 16 private int i; 17 18 public void run() { 19 for (; i < 100; i++) { 20 // this获取当前线程 21 // getName()获取当前线程名称 22 System.out.println(this.getName() + " " + i); 23 } 24 } 25 26 public static void main(String[] args) { 27 for (int i = 0; i < 100; i++) { 28 System.out.println(Thread.currentThread().getName() + " " + i); 29 if(20==i){ 30 Thread t1 = new FirstThread(); 31 t1.setName("线程1"); 32 Thread t2 = new FirstThread(); 33 t2.setName("线程2"); 34 35 t1.start(); 36 t2.start(); 37 } 38 } 39 } 40 }
FirstThread
b、使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。
c、实现Runnable接口创建线程类
1 /** 2 * @Title: SecondThread.java 3 * @Package 4 * @author 任伟 5 * @date 2014-12-5 下午6:53:07 6 * @version V1.0 7 */ 8 9 /** 10 * @ClassName: SecondThread 11 * @Description: 12 * @author 任伟 13 * @date 2014-12-5 下午6:53:07 14 */ 15 public class SecondThread implements Runnable { 16 private int i; 17 18 /* 19 * (non-Javadoc) 20 * 21 * @see java.lang.Runnable#run() 22 */ 23 @Override 24 public void run() { 25 for(;i<100;i++){ 26 System.out.println(Thread.currentThread().getName()+" "+i); 27 } 28 29 } 30 31 public static void main(String[] args) { 32 for (int i = 0; i < 100; i++) { 33 System.out.println(Thread.currentThread().getName()+" "+i); 34 if(20==i){ 35 SecondThread st = new SecondThread(); 36 new Thread(st, "线程1").start(); 37 new Thread(st, "线程2").start(); 38 } 39 } 40 } 41 42 }
SecondThread
d、Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程的执行体。而实际的线程对象依旧是Thread实例,只是该Thread线程负责执行其target的run()方法。
e、采用实现Runnable接口的方式创建多线程,线程类还可以继承其他类;多个线程可以共享一个target对象,便于多个线程处理同一份资源的情况;
f、采用继承Thread类的方式创建多线程,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。