一:线程和进程的区别
进程是所有线程的集合,每一个线程是进程中的一条执行路径;
二:创建线程的三种方式
1.继承Thread类 重写run方法
class CreatThread extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i:" + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
//创建一个子线程实例
CreatThread creatThread = new CreatThread();
//子线程启动: 线程启动是start()方法,启动主线程是run()方法。
creatThread.start();
//主线程启动
for (int i = 0; i < 100; i++) {
System.out.println("main:" + i);
}
}
}
2.实现Runnable接口,重写run方法
class CreatRunable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i:" + i);
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) {
CreatRunable creatRunable = new CreatRunable();
Thread thread = new Thread(creatRunable);
thread.start();
//主线程执行
for (int i = 0; i < 100; i++) {
System.out.println("main:" + i);
}
}
}
3.使用匿名内部类方式
public class ThreadDemo3 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i:" + i);
}
}
}).start();
;
//主线程
for (int i = 0; i < 100; i++) {
System.out.println("main:" + i);
}
}
}
三:多线程的运行状态
1、新建状态
new Thread():当我们new一个线程实例的时候处于新建状态;
2、就绪状态
start():当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。,处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程;
3、运行状态
run():当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法;
4、阻塞状态
sleep():线程通过调用sleep方法进入睡眠状态等;
5、死亡状态
(1) run方法正常退出而自然死亡;
(2) 一个未捕获的异常终止了run方法而使线程猝死;