进程与线程
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
1.1多线程与多进程
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
1.2线程的状态转换
1、新状态:线程对象已经创建,还没有在其上调用start()方法。
2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。
5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
1.3 JAVA中创建线程的方法
JAVA中创建线程的方法有俩种:1。继承Thread类;2.实现Runnable接口
package com.sgl.thread.demo; public class Mythread extends Thread { private int num; private String tname; public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Mythread(int num, String tname) { this.num = num; this.tname = tname; } @Override public void run() { while (num < 100) { System.err.println("线程:" + tname + "--" + num++); } } public static void main(String[] args) { Mythread mythread1 = new Mythread(1, "线程1"); Mythread mythread2 = new Mythread(1, "线程2"); mythread1.start(); mythread2.start(); } }
package com.sgl.thread.demo; public class MyRunnable implements Runnable { private int num=0; @Override public void run() { while(num<100) { System.out.println(num++); } } public static void main(String[] args) { MyRunnable myRunnable=new MyRunnable(); Thread thread=new Thread(myRunnable); thread.start(); } }
1.4JAVA线程内存模型
线程、工作内存、主内存三者之间的交互关系图:
所有线程共享主内存
每个线程有自己的工作内存