目录
1 )线程相关概念
- 进程:可以把一个程序理解为一个进程,如果QQ,微信 都能说是一个进程
- 线程:线程是进程一个执行单元,进程可以说成高速公路的收费口,而线程可以看成其中一个个窗口,进程可以说是由多个线程构成了。如常用的垃圾回收器,就可以看成一个单独的线程。
- 主线程与子线程: jvm运行main方法的线程就是主线程
- 串行,并发与并行
2)多线程的创建
java多线程就是创建一个Thread类,运行 start()方法就可以了。无伦通过继承Thread类还是实现Runnable接口核心上都是new Thread()
runnable只是thread的一个定义
public class Thr {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
Thread thread2 = new Thread(myThread);
thread2.start();
}
}
class MyThread extends Thread{
@Override
public void run() {
System.out.println("这是一个通过 extends Thread创建的子线程");
}
}
class MyThread1 implements Runnable{
@Override
public void run() {
System.out.println("这是一个通过 implements runnable创建的子线程");
}
}
3) 线程的常用方法
currentThread | 能获取当前所在的线程,是一个本地navtie方法 |
---|---|
isAlive | 活动状态就是线程已启动(start)并且尚未终止 |
sleep | 线程休眠(单位毫秒) |
getid | 获取线程的编号,每启动一个线程,编号会自动分配 |
yieId | 释放CPU资源,这时如何有其它线程,则将cpu交给其使用,没有则继续使用cup |
setPriority | 线程优先级(1-10),值越大理伦上占用cpu的时间就多,默认是5,不推荐使用 |
interrupt | 中断线程,理念上的,实际线程并没有终止,只是给线程打上了标记。只有wait、sleep、join三种阻塞状态之一时,interrupt()方法才起作用,否则只有等执行了wait()、join()、sleep()之后,才会抛出InterruptedException异常,抛出异常会清除中断标记。在start()方法前执行无效 |
| 判断是否有终止标记,返回boolean |
setDaemon | 线程分为用户线程与守护线程,区别是如果不存在用户线程,守护线程也将关闭 |
4)线程的生命周期
5)多线程的优势
- 提高系统的吞吐率:多线程编程可以使一个进程有多个并发的操作
- 提高响应性:web服务器会采用一些专门的线程负责用户的请求处理,缩短了用户的等待时间
- 充分利用多核处理器资源(如一个四核cpu单线程就只有一核在执行)
6)多线程的问题
- 线程安全问题:多线程共享数据时,容易冲突
- 线程活性:程序缺陷或者资源稀缺导入一真处于非RUNNABLE状态如 死锁,锁死,活锁,饥饿
- 上下文切换:
- 可靠性: 一个线程可能会导致jvm意外终止,其它线程也无法执行
7) 易忘点
-
yield()与setDaemon(true)的作用
- interrupt() 的作用,概括就是interrupt()中断后,遇到wait(),sleep(),join()会抛出异常,同时会清除中断标记