程序:一条一条的按照语法规则排列起来的指令序列,告诉计算机完成一连串的操作,程序默认的是保存在硬盘上的;
当程序开始执行的时候,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); } }}希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!
新闻热点
疑难解答