概念
进程——进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程——线程是程序中一个单一的顺序控制流程。
区别
1)进程是操作系统资源分配的单位。线程是操作系统执行的单位。
2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不 可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
3)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
4)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
5)调度和切换:线程上下文切换比进程上下文切换要快得多。
6)在多线程OS中,进程不是一个可执行的实体。
多线程编程
概念
在单个程序中同时运行多个线程完成不同的工作,称为多线程。
在多线程系统里, 进程里至少包含一个线程。操作系统为解决某一问题而创建一进程,当此进程在执行过程中可以划分为多个流程并且这些流程的执行顺 序或结果之间互不影响则可以采用多线程,反之不可以。
分析
如图,系统创建进程1,完成进程1共需要3个流程,分别为流程1、流程2、流程3。由于3个流程在执行时要按1-2-3的顺序执行即3个流程之间互相影响,所以进程1中仅需要一个线程即可完成该任务(一个进程至少包含一个线程)。
如图,进程2同样包含3个流程,与进程1不同的是,流程2与流程3的执行顺序及作用效果之间互不影响,即流程2与流程3相对独立,所以此时可以使用两个线程完成该进程所要完成的任务。线程1首先执行流程1,当完成流程1后,创建线程2,而此时线程1可以继续完成流程2,线程2则去执行流程3。线程1与线程2完成退出后即完成整个进程任务。
线程创建的两种方式
一、实现Runnable接口,实现run方法
public class Thread1 implements Runnable{
private Thread t;
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<=10;i++)
{
System.out.println(i);//打印1-10
try {
t.sleep(1000);//每隔1秒打印一次
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void start()
{
t=new Thread(this);
t.start();//启动新线程
}
public static void main(String args[])
{
Thread1 th=new Thread1();
th.start();
for(int i=0;i<10;i++)
{
System.out.println("hello word");//打印hello word
try {
new Thread().sleep(500);//每隔半秒打印一次
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
二、继承Thread类,重写run方法
public class Thread2 extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0;i<10;i++)
{
System.out.println(i);//打印0-10
try {
new Thread().sleep(500);//每隔半秒钟打印一次
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[])
{
Thread2 the=new Thread2();
the.start();//启动线程
for(int i=0;i<10;i++)
{
System.out.println("hello word");//打印“hello word”
try {
new Thread().sleep(1000);//每隔一秒打印一次
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
总结
进程是静态的,而线程是动态的。进程好比家庭,是社会细胞。线程好比家庭成员,注意,家庭成员可以共享筷子,碗,电视,沙发......等家庭资源。但是家庭之间一般不共享这些,因为他门使用自己的。在多线程编程中使用线程可以把占据时间长的程序中的任务放到后台去处理,使程序运行的更快,节省时间,通过提高资源使用效率来提高系统的效率。尽管多线程编程有很大的好处,但是如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。更多的线程需要更多的内存空间。线程可能会给程序带来更多“bug”,因此要小心使用。线程的中止需要考虑其对程序运行的影响。通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生以及线程同步执行所带来的线程安全问题。