进程与线程

一、进程与线程

程序:通俗的讲,程序是一个包含可执行代码的静态的文件,是应用软件执行的蓝本。
进程:进程是一个已经执行但是还没有结束的程序的实例,可以看作是程序的一次动态执行。
当程序被系统调用到内存后,系统会给程序分配一定的资源(内存、设备等),然后进行一系列操作使得静态的程序变成动态的进程以供系统调用。
线程:线程是进程的组成部分。一个进程中可以只有一个线程,也可以有多个线程。线程不单独占用系统资源。

二、线程的创建

什么叫多线程?
多线程指在一个进程中运行了两个或两个以上的线程。事实上绝大多数代码用单线程就可以实现,那为什么还要有多线程?其实多线程的本质目的是为了提高CPU的利用率。在一个进程中,线程之间的资源是可以共享的。同时,线程是并发执行的。
这里需要分辨两个概念,并行性和并发性。
并行性:在同一时刻有多条命令同时执行。
并发性:在同一时刻只执行一条命令,但是在一个时间段内是有多条相同命令交替轮换执行的。其交替执行的频率远远高于人眼能够分辨的频率,所以营造出了它们是同时执行的感觉。
java线程的创建我们介绍两种方式。
一、继承Thread类
1、创建Thread子类
2、重写run方法
3、创建子类对象,调用start()方法
特别注意:通过继承Thread类来创建新的线程,调用时必须使用start方法,接下来会自动调用run方法。但如果调用时直接使用run方法,程序会将该子类看做一个普通的类调用了一个叫做run的方法,并没有创建新的进程。

public class Test {
	
    public static void main(String[] args){
    	MyThread t1 = new MyThread(1);
    	MyThread t2 = new MyThread(2);
    	t1.start();
    	t2.start();
    }
}
public class MyThread extends Thread{
	
	private int n;
	
	MyThread(int n){
		this.n = n;
	}
	public void run(){
		for(int i=0 ; i<15 ; i++)
			System.out.println("这是我的第"+n+"个线程,输出"+i);
	}
}

运行结果:
在这里插入图片描述
从运行结果可知:t1和t2两个线程创建成功,它们并发执行。
我们试着直接调用run方法。

public class Test {
	
    public static void main(String[] args){
    	MyThread t1 = new MyThread(1);
    	MyThread t2 = new MyThread(2);
    	t1.run();
    	t2.run();
    }
}
public class MyThread extends Thread{
	
	private int n;
	
	MyThread(int n){
		this.n = n;
	}
	public void run(){
		for(int i=0 ; i<15 ; i++)
			System.out.println("这是我的第"+n+"个线程,输出"+i);
	}
}

运行结果:
在这里插入图片描述
结果按照顺序执行,t1和t2只是两个叫做MyThread类的普通对象,并没有创建新的进程。

二、实现Runnable接口
1、定义Runnable的实现类
2、重写run方法
3、创建Runnable实现类的对象,用该对象作为Thread的target来创建Thread对象。
4、调用start方法

public class Test {
	
    public static void main(String[] args){
    	MyThread t1 = new MyThread(1);
    	MyThread t2 = new MyThread(2);
    	Thread tt1 = new Thread(t1);
    	Thread tt2 = new Thread(t2);
    	tt1.start();
    	tt2.start();
    }
}
public class MyThread implements Runnable{
	
	private int n;
	
	MyThread(int n){
		this.n = n;
	}
	public void run(){
		for(int i=0 ; i<15 ; i++)
			System.out.println("这是我的第"+n+"个线程,输出"+i);
	}
}

运行结果:
在这里插入图片描述 从运行结果可知:t1和t2两个线程创建成功,它们并发执行。