一、进程:进程就是一个正在执行的程序。
二、线程:线程是进程执行的一条线索或路径。进程中至少有一个线程存在。
三、多线程:顾名思义,一个进程中的多个线程。
线程的开始:当要运行一个程序时,JVM首先会找到main函数,然后从main函数开始执行(也就是说,程序是从main函数开始运行的),
此时,程序就成为一个进程,既然是进程肯定有线程的存在。此时的线程就是主线程,主线程会向下顺序执行代码。
如果程序中存在一个庞大的循环语句,主程序就会一直在这里运行,直到循环语句结束,下面的代码才能被执行到。
这可能要花费较长的时间,影响了程序运行的效率。所以,为了提高程序的效率,就引入了多线程。由主线程开辟另一个或多个线程,
让这些线程都去执行代码。
创建线程的两种方法:
一、1.定义一个类继承Thread,重写Thread中的run方法,run方法中存放自定义的要让该程序执行的代码。
2.用子类new一个线程对象,线程对象调用线程中的start方法,来开启线程。
class Demo extends Thread
{
public void run()
{
System.out.println("我要运行的代码");
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Demo d=new Demo();
d.start();
}
}
二、1.实现Runnable接口,复写run方法。
2.用Thread来new一个线程对象,并将Runnable的子类对象传入Thread的构造方法中。
class Demo implements Runnable
{
public void run()
{
System.out.println("Hello World");
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Thread t=new Thread(new Demo());
t.start();
两种方法的比较:Java中的类只能继承一个类,第一种方法中,当Demo继承了Thread之后,就不能再继承其
他类,但Demo很有可能是另一个类的子类,这时就出现了局限。第二种方法中,Demo实现了接口Runnable,
同时还能成为其他类的子类,使用较多。
单核状态下,在某一时刻只有一个线程在运行。某一时刻可能有多个进程,每个进程中也可能有多个线程,CPU就在这
些线程间来回的切换,线程也只有在获得CPU的执行权时才能运行。
四、线程的四个运行状态:
1.运行:既有执行资格又有执行权。
2.堵塞(临时状态):有执行资格没有执行权。等待CPU的执行权,一旦获得就进入运行状态。
3.冻结:没有执行资格也没有执行权。CPU不会分配执行权给它,直到它被唤醒。
从运行状态进入冻结状态:sleep(time)或wait();
被唤醒:sleep的时间到或notify().
4.消亡:run方法结束,或stop()