进程与线程,线程的两种创建方式

2/22/2017来源:ASP.NET技巧人气:1682

程序:一条一条的按照语法规则排列起来的指令序列,告诉计算机完成一连串的操作,程序默认的是保存在硬盘上的;

当程序开始执行的时候,OS(操作系统)要把程序装入内存,然后CPU从内存中一条一条的读取并执行指令;

当一个程序被装入内存,正在执行的时候,这时这个程序就被称为一个进程(正在进行的程序);

OS(操作系统)是如何做到多进程同时执行的呢?

操作系统把时间单位平均分成若干小份,每一个小份称为一个时间片,操作系统在不同时间片里去执行不同进程的指令,如上图在时间片中执行A进程或B进程;

操作系统是如何做到多线程同时执行的呢?也是通过时间片的形式,把进程的时间片分为更小的时间片。

在一个进程中同时执行的多个操作称为线程。

进程和线程的区别:

1 . 每个进程都有各自独立的内存空间,而线程没有独立的内存空间;

2 . 线程必须要运行在进程之内,换句话说没有进程,就不会有线程;

3 . 线程可以共享进程的内存空间;

线程是程序中的执行程序。java虚拟机允许应用程序并发地运行多个执行线程。

创建新执行行程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。

任意一个项目

main方法:

public class Main {
	public static void main(String[] args) {
		// 我们这段程序中包含了三个线程,第一个是主线程.主线程是JVM启动的时候创建的
		// 并且在主线程中调用类main方法.程序执行的时候,主线程处于正在运行状态.这样的话才能执行main方法
		// 创建线程对象
		Thread1 t1 = new Thread1("小黑线程");
		Thread2 t2 = new Thread2("小红线程");
		// 启动线程的时候要调用线程的start()方法.线程启动之后,会自动的执行线程体
		// 这样的话,两个线程会交替执行
		t1.start();
		t2.start();
		// 而不能直接调用线程的run()方法.这样两个线程会失去并发性.一个执行完另一个再执行
		// t1.run();
		// t2.run();
		// 我们也可以让主线程执行某些操作
		// 主线程和我们自己创建的线程一样,也就是一个线程而已.只不过这个线程是JVM启动的时候由JVM创建的
		for (int i = 1; i <= 500000; i++) {
			System.err.PRintln("主线程在计数:i=======" + i);
		}
	}
}

线程1:

public class Thread1 extends Thread {
	public Thread1(String name) {
		super(name);
	}
	// 我们把线程要执行的操作写在run方法中
	// run()方法又被称为线程体
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			System.out.println(this.getName() + "在计数:i=" + i);
		}
	}
}

线程2:

public class Thread2 extends Thread {
	public Thread2(String name){
		super(name);
	}
	// 我们把线程要执行的操作写在run方法中
	// run()方法又被称为线程体
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			System.err.println( this.getName() +"在计数:i=" + i);
		}
	}
}

创建线程的另一种方法是声名实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。

任意一个项目

main方法:

public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建两个目标对象
		Runnable tar1 = new Target1();
		Runnable tar2 = new Target2();
		// 创建线程对象,并让线程对象来执行指定的目标对象
		Thread t1 = new Thread(tar1, "小黑线程"); // t1线程来执行目标1,t1线程的名字叫 小黑线程
		Thread t2 = new Thread(tar2, "小红线程");
		// 启动线程.线程启动之后会自动的执行目标对象
		t1.start();
		t2.start();
	}
}线程1:

// 我们把实现Runnable接口的类称为目标对象,也就是专门用来给线程执行的
public class Target1 implements Runnable {
	@Override
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			// 目标对象是专门来给线程对象执行的
			// 我们需要在目标中获取正在执行该目标的线程对象: Thread.currentThread();
			System.out.println(Thread.currentThread().getName() + "正在工作, 小黑目标在计数:i=" + i);
		}
	}
}线程2:
public class Target2 implements Runnable {
	@Override
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			System.err.println(Thread.currentThread().getName() + "正在工作,小红目标在计数:i=" + i);
		}
	}
}

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!