1.进程是指运行中的应用程序,每一个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程。
2.Java线程的运行机制
在Java 虚拟机进程中,执行程序代码的任务是由线程来完成的。每个线程都有一
个独立的程序计数器和方法调用栈(method invocation stack)。
1.程序计数器: 也称为PC 寄存器,当线程执行一个方法时,程序计数器指向方法区中下一条要执行的字节码指令。
2.方法调用栈: 简称方法栈,用来跟踪线程运行中一系列的方法调用过程,栈就会向方法栈压入一个中的元素称为栈帧。每 当线程调用一个方法的时候,新帧。帧用来存储方法的参数、局部变量和运算过程中的临时数据。
栈帧由以下3 部分组成。
1.局部变量区: 存放局部变量和方法参数。
2.操作数栈: 是线程的工作区,用来存放运算过程中生成的临时数据。
3.栈数据区: 为线程执行指令提供相关的信息,包括如何定位到位于堆区和方以及如何正常退出方法或者异常中断方法。
法区的特定数据,
每当用java 命令启动一个Java 虚拟机进程时,Java 虚拟机都会创建一个主线程,
线程从程序入口main()方法开始执行。
4.线程的创建和启动
创建线程有两种方式:
1.扩展java.long.Thread类
2.实现Runnable接口
5.扩展java.lang.Thread 类
Thread 类代表线程类,它的最主要的两个方法是:
1.run(一包含线程运行时所执行的代码。
2.start()一用于启动线程。
用户的线程类只需要继承Thread 类,覆盖Thread 类的run(方法即可。在Thread类中,run()方法的定义如下:
public void run()
该方法没有声明抛出任何异常,根据方法覆盖的规则(方法覆盖),Thread 子类的run() 方法也不能声明抛出任何异常。
package extendth; public class Machine extenda Thread{ public void run( ); for(int a=0;a<50;a++){ System,out.println(a) ; } public static void main(String args []) { Machine machine-new Machine () ↑ machine.start();//启动machine线程 } }
6.主线程与用户自定义的线程并发运行
package allrun; public class Machine extends Thread{ public void run() { for(int a=0;a<50;a++){ System.out.printin(currentThread.gtName:"+a) ; try( 1/给其他线程运行的机会 sleep(100) : )catch (InterruptedException e) { throw new RuntimeException(e) ; }
}
}
} public static void main(String args[ ]) { Machine machinel=new Machine () ; //创建第一个Machine对象 Machine machine2=new Machine() ; / /创建第二个Machine 对象 ,/启动第一个Machine 线程 machinel.start () ; machine2.start () ; //启动第二个Machine 线程 //主线程执行第一个Machine 对象的run( )方法 machine1. run () ;
7.多个线程共享同一个对象的实例变量
public void run(){ //使用Machine 对象的实例变量a for (a=0;a<50;a++) { System.out.printn(currenthread(.getName(+" "+a); } try{ sleep(100) ; }catch(InterruptedException e){ throw new RuntimeException(e) ; } public static void main(String argst ]) { Machine machine=new Machine () : machine.start(); machine.nun(); }