基本概念
CPU核心数和线程数之间的关系:核心数:线程数=1:1;使用超线程技术可以达到1:2。CPU时间切片旋转机制:导致上下文切换过程的RR调度机制:程序运行资源分配的最小单元进程内部有多个线程,在运行时共享进程的资源线程。CPU调度的最小单位,线程必须根据进程存在。
CPU --->线程
并发编程的优缺点
- 优点:能够充分利用CPU的资源、加快用户响应的时间,程序模块化,异步化
- 缺点:线程共享资源,存在冲突;容易导致死锁;启动太多的线程,就有可能导致服务器宕机。
Java线程
- Java开启线程的方式:
继承Thread类 重写run方法;
public class UseThread extends Thread{
public UseThread(String name) {
super(name);
}
@Override
public void run() {
String threadName = T().getName();
while(true) {
Sy(threadName+" is run!");
}
//Sy(threadName+" interrput flag is "+isInterrupted());
}
}
public static void main(String[] args) throws InterruptedException {
Thread endThread = new UseThread("endThread");
endT()
}
实现Runable接口,重新run方法
public class UseRunnable implements Runnable{
@Override
public void run() {
//doSomeThing
}
public static void main(String[] args) {
UseRunnable useRunnable = new UseRunnable();
Thread endThread = new Thread(useRunnable,"endThread");
endT();
}
}
实现Callable接口,重新call方法
/*实现Callable接口,允许有返回值*/
private static class UseCallable implements Callable<Integer>{
private int sum;
@Override
public Integer call() throws Exception {
//doSomeThing
}
public static void main(String[] args) {
UseCallable useCallable = new UseCallable();
FutureTask<Integer> futureTask = new FutureTask<Integer>(useCallable);
new Thread(futureTask).start();
}
}
- Java停止线程的方式
stop()、resume()、suspend() 等三种方式;
stop():会导致线程资源不能正常的释放;suspend():容易导致死锁
线程要怎样才能安全的停止呢?
答:线程自然终止:线程执行完毕或者抛出异常结束
注意:Java线程是协作方式运行,并非抢占模式。
- Java线程中断
interrupt():调用一个interupt()方法中断一个线程,并不是强行关闭这个线程;只是跟这个线程打了一个招呼;将线程中的中断表示改为true,线程是否中断,由线程本身决定。
isInterrupted()判断当前线程是否处于中断状态,同时中断的状态改为false方法里如果抛出InterruptedException,线程的中断标志位会被复位成false,如果确实是需要中断线程,要求我们自己在catch语句块里再次调用interrupt()
线程的状态
- 线程只有5种状态。整个生命周期就是这几种状态的切换。
线程的状态切换图
线程常用方法
- run()和start() :run方法就是普通对象的普通方法,只有调用了start()后,Java才会将线程对象和操作系统中实际的线程进行映射,再来执行run方法。
- yield() :让出cpu的执行权,将线程从运行转到可运行状态,但是下个时间片,该线程依然有可能被再次选中运行。
线程的优先级
取值1~10,缺省值为5,但是线程的优先级不可靠,在开发过程中不建议使用线程的优先级进行开发。
守护进程
和主线程同死,finally代码块不一定会被执行到。