1:计算机的CPU承担了所有的任务,他就像一座工厂,时刻在运行。
2:CPU一次只能执行一个任务,我们可以假定工厂的电力有限,一次只能供给一个车间使用,也就是说一个车间开工时,其他车间都必须停工。
3:进程就好比工厂的车间,它代表着CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
4:一个车间里有很多工人,他们协同完成一个任务,线程就好比车间里的工人,一个进程包括了多个线程。
综上所述:
A:进程是程序在某个数据集上的执行,他是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而处于等待状态,因任务完成任务而被销毁。
B:线程是一个程序里的不同执行路径,以前说编写的程序,每个程序都有一个入口,一个出口,以及顺序的执行点,事实上,在单个程序的内部是可以在同一时刻进行多种运算的,这就是所谓的多线程。
多线程的优点:
多线程编程简单,效率高(能直接共享数据和资源,多进程不能做到),适合开发服务程序(如:web服务,聊天服务)。
创建线程!
方法一:
1:创建一个继承Thread的类(如类A),并重写Thread中的run()方法。
2:创建类A的对象(如 a)。
3:调用start()方法【start()方法是从Thread继承过来的】.
/* * 创建一个类继承Thread */ class A extends Thread{ @Override public void run() { while (true){ System.out.println("你好!"); } } } public class ThreadTest1 { public static void main(String[] args) { /*创建A的对象*/ A a = new A(); /*调用.start()方法启动线程*/ a.start(); while (true){ System.out.println("我好~~~~~"); } } }
程序运行的结果:
从图中可以发现,即使类A中有个死循环,但是依然输出了“我好~~~”,这就说明,多线程可以执行一个程序的多条路径。
注意:
1:对象调用的是.start()方法而不是.run()方法,如果调用run()方法,程序就变成单线程了,还是会顺序执行。
2:调用.start()方法后并不表示对象对应的线程就一定会立即得到执行,执行完后只代表该对象具有了被CPU执行的资格,但由于想抢占执行的线程很多,CPU不一定会立即去执行。
3:一个Thread对象能且只能代表一个线程,一个Thread对象不能调用两次start()方法,否则会抛出异常。
线程状态的切换:
从图中就可以看出,调用start()之后,只是进入就绪状态,并不是运行状态。
方法二:
1:定义一个类(如类A),并实现Runnable接口。
2:创建A的对象a。
3:利用a构造一个Thread对象thread。
4:调用thread中的start()方法。
/** * 创建一个类实现Runnable接口 * @author Liao * */ class A implements Runnable{ @Override public void run() { while (true){ System.out.println("你好!!!"); } } } public class ThreadTest2 { public static void main(String[] args) { /*创建A的对象*/ A a = new A(); /*利用a构建Thread的对象*/ Thread thread = new Thread(a); /*启动线程*/ thread.start(); while (true){ System.out.println("BBBB~~~~~"); } } }