首页 > 学院 > 开发设计 > 正文

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

2019-11-08 02:54:21
字体:
来源:转载
供稿:网友

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

当程序开始执行的时候,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);		}	}}

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表