常用API
public final String getName():获取线程的名字
public final void setName(String name):设置线程的名字
public static Thread currentThread():获取当前正在执行的线程对象
public final int getPriority():获取线程的优先级
默认等级为5
范围:1-10
public final void setPriority(int newPriority):设置优先级
public final void setDaemon(boolean on):设置守护线程
public static void sleep(long millis):睡觉,形参是毫秒值
1.线程生命周期
新建,就绪,运行,阻塞,终止
简单版:
复杂版:
2.wait() 和 sleep() 方法的区别?
从三个角度来说,
1.对于同步锁:在同步锁代码块中,wait()会释放同步锁,让其他线程进入synchronized,sleep()则不然,并不会释放锁
2.使用范围不同:sleep是Thread中的方法,wait是Object里的方法,sleep()可以在任何地方使用,但是wait()只能在同步控制方法或者同步控制块中使用,否则会抛出IllegalMonitorStateException
3.恢复方式不同:sleep()时间到了自动恢复,wait()需要其他线程调用同一对象的notify()和notifyAll()
具体代码参考:sleep() 和 wait() 的区别_yinhuanxu-CSDN博客_sleep和wait
3.线程的 join() 方法是干啥用的?
如果一个线程A执行了另外个线程的例如:threadB.join() 含义是线程A立刻进入阻塞,线程B开始执行,执行完毕后线程A再继续执行
参考以下代码:
public class TestJoin {
public static void main(String[] args) throws Exception {
//1
System.out.println("进入线程:" + Thread.currentThread().getName());
Service service = new Service();
MyThread myThread = new MyThread(service);
myThread.setName("myThread线程");
//3
myThread.start();
//2
System.out.println("线程:" + Thread.currentThread().getName() + "等待");
//主线程开始等待
myThread.join();
//6
System.out.println("线程" + Thread.currentThread().getName() + "继续执行");
}
}
class MyThread extends Thread{
public MyThread(Service service) {
}
@Override
public void run() {
//4
System.out.println("进入线程" + Thread.currentThread().getName());
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//5
System.out.println("线程" + Thread.currentThread().getName() + "执行完毕");
}
}
结果为:
查阅 join() 源码发现 join中用了 wait() 方法,
由于 wait() 方法会让线程进入阻塞状态,并且会释放线程占有锁,并交出CPU执行权限
所以 join() 方法也同样会让线程释放该运行线程锁
4.Thread 调用 start() 方法和调用 run() 方法的区别 ?
start():会new一个新线程
run():重写Thread里面的方法,并不会新开一个线程
例如:
1.结果为线程A,线程A,线程A,线程A,线程B,线程B,线程B,线程B
2.结果为线程A,线程B,线程A,线程B,线程A,线程B,线程B,线程A
的区别
5.编写多线程的几种实现方式
(1)继承Thread类
(2)实现Runnable接口
(3)实现Callable接口
其中 Thread其实也是实现了Runable接口
Runnable和Callable的主要区别在于是否有返回值
6.为什么要使用线程池?直接new个线程不是很舒服?
如果频繁new线程,不仅会消耗系统资源,还会降低系统的稳定性
线程池好处:
1.降低资源消耗 通过重复利用已创建的线程 降低线程创建和销毁造成的消耗
2.提高相应速度 进程到位时 可以直接从线程池中拿取线程执行任务
3.增加线程的可管理型 线程是稀缺资源 使用线程池可以进行统一分配 调优和监控
7.线程池的核心属性
1.threadFactory(线程工厂): 用于创建工作线程的工厂
2.corePoolSize(核心线程数):当线程池运行的线程少于corePoolSize,将创建一个新线程来处理请求,即使其他工作线程未被使用
3.workQueue(队列): 用于保留任务并移交给工作线程的阻塞队列
4.maximumPoolSize(最大线程数)
5.handler(拒绝策略):当任务量超过线程池可以保存的最大任务数时,执行的策略
6.keepAliveTime(保持存活时间):空闲线程存活时间
7.TimeUnit:时间单位