What?
先给大家推荐一片文章:
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
进程: 程序的一次运行,程序运行的时候至少包含一个进程(也可能包含多个)
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程: 一个进程至少包含一个线程(也可能包含多个线程),线程是程序的一个独立的执行路径(顺序执行流).
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
关系
一个线程可以创建和撤销另一个线程;
同一个进程中的多个线程之间可以并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
进程和线程的区别?
一.定义
进程: 程序的一次运行,程序运行的时候至少包含一个进程(也可能包含多个)
线程: 一个进程至少包含一个线程(也可能包含多个线程),线程是程序的一个独立的执行路径(顺序执行流).
二.系统开销
进程开销大
启动一个程序, 操作系统会为这个进程 开辟 5段空间:
(1) 栈(虚拟机栈) 方法调用的时候要入栈、方法执行完毕以后要出栈, 局部变量分配在栈里….
(2) 堆 程序运行的时候,动态分配的空间 都在堆里 , new 出来的东西都在堆里 对象 数组 ….. 实例变量在堆里
(3)方法区(也叫做静态区) 放方法的代码…静态变量等 常量池属于方法区
(4) 本地方法栈 java 也能够调用其他语言的代码(c),专门为其他语言(c语言)方法调用的时候 使用的栈
(5) PC (Program Counter) 程序计数器
线程开销小
再启动一个线程, 只会为这个线程 开辟一个单独的栈和PC,用来给这个线程 作为方法调用使用的,堆不会再创建新的。
多个线程共用一个堆、一个方法区。
最后给大家推荐另一篇文章:
http://blog.csdn.net/nylx/article/details/51058389
实现多线程的两种方式
一.继承Thread类
1.通过继承java.lang.Thread类实现,重写它的run方法(run方法称为线程体)
2.通过创建Thread类(子类)的对象来创建新的线程
3.调用Thread类对象的start方法启动一个线程。
public class MyThread extends Thread {
// 1,继承Thread重写run
@Override
public void run() {
super.run();
for (int i = 0; i < 1000; i++) {
System.out.println("" + this.getName() + " " + i);
}
}
public static void main(String[] args) {
// 2.新建一个线程
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
System.out.println("启动线程mt1");
//3.启动线程
mt1.start();
System.out.println("启动线程mt1");
mt2.start();
System.out.println("启动完毕");
}
}
二.实现Runnable接口
1.实现Runnable接口,实现它的run方法
2.创建实现了Runnable接口的类的对象r1
创建Thread对象,并把r1作为参数传给Thread类的构造函数
3.调用Thread对象的start方法
public class MyRunable implements Runnable{
private static int sum=0;
@Override
public void run() {
int name=sum++;
for(int i=0;i<1000;i++){
System.out.println("Thread---"+name+" "+i);
}
}
public static void main(String[] args) {
MyRunable mr=new MyRunable();
Thread t1=new Thread(mr);
Thread t2=new Thread(mr);
t1.start();
t2.start();
}
}