定义:
进程:是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元
线程:进程中的一个独立的控制单元,控制着进程的执行,一个进程至少有一个线程
--------------------------------------------------------------------------------------------
JVM启动时会有一个进程:java.exe
该进程中至少有一个线程负责java程序的执行,这个线程运行的代码存在于main方法中
该线程称为主线程
--------------------------------------------------------------------------------------------
JVM启动时就是多线程:
主线程,垃圾回收机制线程。
没有垃圾回收线程,会造成主线程停止,运行垃圾回收机制清理内存,程序不动
--------------------------------------------------------------------------------------------
提高效率
多部分代码同时进行
--------------------------------------------------------------------------------------------
如何自定义多线程:java.lang.Thread类
第一种方法:继承Thread类,覆盖run()
代码:
class Demo extends Thread{
public void run(){ }
}
建立一个对象,就会创建一个线程:
Demo d=new Demo();
d.start();//打开线程,并使JVM调用run()
覆写run()原因:Thread用于描述线程,该类定义了一个功能
用于存储线程要运行的代码,该存储功能就是run();
获取线程对象以及名称:
线程都有自己默认的名称:Thread-编号,可通过getName()获取
父类中有Thread(String name)构造方法,故自定义名称直接在自定义类中构造方法传入super(name)即可,或者setName()
static Thread currentThread():返回当前正在执行的线程对象的引用(用于获取对象)
Thread.currentThread()==this//返回true;
-------------------------------------------------------------------------
第二种方法:实现Runnable接口的类
代码:
class Demo implements Runnable{
public void run(){}
}
在main中:
Demo d=new Demo();//与Thread无关
Thread t1=new Thread(d);//只有一个共享对象d
t1.start();
------------------------------------------------------------------------
实现方式与继承方式的区别:
class Student extends Thread{
public void run(){}
}
class Student extends Person implements Runnable{
public void run(){}
}
实现方式的好处:
避开了单继承的局限性
定义线程时建议使用
继承Thread:线程代码存放于Thread子类run()中
实现Runnable:线程代码存放在接口子类run()中
-------------------------------------------------------------------------
对于run()中的代码若有异常,只能处理,无法抛出
原因:接口run()没有抛出异常