一,线程与进程的区别
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。
进程就是所有线程的集合,每个一个线程是进程中的一条执行路径
二,多线程创建方式
- 第一种:继承Thread类重写run方法
class CreateThread extends Thread {
public void run() {
for(int i = 0; i<100; i++) {
System.out.println(i)
}
}
}
public class ThreadDemo{
public static void main(String[] args){
//1.创建一个线程
CreateThread createThread = new CreateThread();
//2.开始执行线程 开启线程不是调用run方法,而是start方法
createThread.start();
}
}
- 第二种实现Runable接口,重写run方法
class CreateRunnable imlements Runnable {
public void run() {
for(int i=0; i<100; i++){
System.out.println(i)
}
}
}
public class ThreadDemo {
public static void main(String[] args){
//创建一个线程
CreateRunnable createRunnable = new CreateRunnable();
//开始执行线程
Thread thread = new Thread(createRunable);
thread.start();
}
}
- 第三种使用匿名内部类方式
public class ThreadDemo {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
System.out.println("匿名内部类创建线程");
}
});
}
}
- 第四种jkd1.8中lambda 表达式创建线程
public class ThreadDemo {
public static void main(String[] args) {
new Thread(() -> {
System.out.println("JDK1.8中的Lambda表达式创建线程");
}).start();
}
}
使用继承Thread类还是使用实现Runnable接口好?
- 实现Runnable接口避免了单继承的局限性。
- 实现Runnable接口更加符合面向对象。
-
实现Runnable接口将线程任务单独分离出来封装成对象,线程对象和线程任务进行解耦
三,线程对象常用api
start() | 启动线程 |
currentThread() | 获取当前线程对象 |
getId() | 获取当前线程Id |
getName() | 获取当前线程名称 |
sleep(long mull) | 休眠线程 |
stop() | 停止线程 |
yield() | 释放当前线程的控制权,将控制权交由cpu调度 |
setDaemon(Boolean on) | 设置当前线程为守护线程 |
isDeamon() | 判断该线程是否是守护线程 |
join() | 其他线程变为等待,此线程执行完毕,才释放 |
setPriority() | 设置线程的优先级 |
四.守护线程
java中有两种线程,一种是用户线程,另一种是守护线程。
用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止。
守护线程当进程不存在或主线程停止,守护线程也会被停止。
使用setDeamon(true)方法设置为守护线程。
五,多线程运行状态
线程从创建,运行到结束总是处于下面五个状态之一:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。
- 新建状态
当用new操作符创建一个线程时,new Thread(); 线程还没有开始运行,此时线程处于在新建状态。 - 就绪状态
一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法,当线程对象调用start()方法后,处于就绪状态。处于就绪状态的线程并不一定立即运行run()方法,线程还得和其他线程竞争cpu。 - 运行状态
当线程获得cpu时间后,才进入运行状态,真正开始执行run()方法。 - 阻塞状态
线程通过调用sleep方法进入睡眠状态。
线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者。
线程试图得到一个锁,而该锁正被其他线程持有。
线程在等待某个触发条件 - 死亡状态
run方法正常退出而自然死亡
一个未捕获的异常终止了run方法而使线程猝死。