进程和线程的区别
进程:进程就是正在运行中的程序(进程是驻留在内存中的),是系统执行资源分配和调动的独立单位。每个进程都有自己占用的独立存储空间和系统资源。
线程:线程就是进程中的单个顺序控制流。
单线程:一个进程中包含一个顺序控制流(一条执行路径)
单线程:一个进程中包含多个顺序控制流(多条执行路径)
多线程的实现方法
方法一:继承Thread类
1、创建一个MyThread类,继承Thread类
2、重写run()方法
3、在测试类中创建MyThread类的对象
4、启动线程
步骤1、2
package com.pj.thread.mythread;
/**
* @author pj_hxj
* @Description:
*/
public class MyThread extends Thread {
public MyThread() {
}
@Override
public void run() {
for (int i = 0; i <50 ; i++) {
System.out.println("i="+i);
}
}
}
步骤3、4
public class Demo1 {
public static void main(String[] args) {
//创建类对象
MyThread myThread01 = new MyThread();
MyThread myThread02 = new MyThread();
MyThread myThread03 = new MyThread();
//启动线程
myThread01.start();
myThread02.start();
myThread03.start();
}
}
运行结果:
可以看出三个线程在抢占CPU。在相互交替运行。每次运行的结果各不相同
方法二:实现Runnable接口
1、创建一个MyRunnable类,实现Runnable接口
2、重写run()方法
3、创建Thread类的对象,并把MyRunnable对象作为参数传入
4、启动线程
步骤1、2
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
步骤3、4
public class Demo2 {
public static void main(String[] args) {
//创建myRunnable类的对象
MyRunnable myRunnable = new MyRunnable();
//创建Thread类的对象,并把MyRunnable对象作为参数传入
Thread t01 = new Thread(myRunnable,"线程1");
Thread t02 = new Thread(myRunnable,"线程2");
Thread t03 = new Thread(myRunnable,"线程3");
//启动线程
t01.start();
t02.start();
t03.start();
}
}
运行结果
方法三:实现Callable接口
实现的方法与方法二相似
线程的生命周期
创建:创建线程对象(通过start方法进入到下一个状态)
就绪:有运行的资格但是没有运行权,需要抢占CPU的执行权
运行:有运行的资格并且没有运行权,但是有可能被其他的线程抢走运行权。或者遇到阻塞线程,等其执行完回到就绪状态,继续抢占CPU的执行权。
死亡:成为垃圾,等待被回收