一、相关概念
程序:是操作系统中实现多个功能的代码块,也叫软件
进程:正在运行中的程序
多进程:同时运行多个进程
线程:是进程中的一个任务,顺序执行流
多线程:同时执行一个进程中的多个线程
并发:cpu只有一个,于是cpu在多个线程上来回切换进行执行的
二、线程的创建方式
1)继承Thread类 -->重写run方法,调用start()开始执行
2)实现Runnable接口 -->重写run方法,实例化一个Thread类,进行调用
3)实现FutureTask来创建线程,用Callable来创建任务,最后将FutureTask对象传入到Thread对象中,启动线程运行
FutureTask<String> fu = new FutureTask<>(new Callable<String>{
public String call() throws Exception{
//写你要线程执行的内容,此方法相当于run方法
return null;
}
});
三、守护线程
当前台线程结束后,后台线程自动结束。
所有的线程默认是前台线程,让某个线程变成后台线程只需要调用他的setDaemon为true即可
四、sleep()方法和interrupt()方法
void sleep(long ms)
Thread类提供的一个静态方法。表示让当前线程休眠ms毫秒,在此过程中,如果该线程被打断,会抛出InterruptedException。如果休眠过程一直没有被打断,时间一到,线程的休眠状态自动解除,等待CPU的到来,一旦CPU过来,则继续执行后续代码
void interrupt()
手动打断某个正在休眠的线程,一旦调用该方法则正在休眠的线程会抛出InterruptedException
(在匿名内部类中,要使用局部变量,那么这个变量必须使用final修饰)
五、Thread.currentThread()等方法;
获取当前正在运行的线程
Thread t = Thread.currentThread();
//线程名
t.getName();
//线程ID
t.getId();
/**
*获取线程优先级
*1-10
*10最大
*1最小
*5正常
*理论上来说,优先级越高,获取CPU的概率越大
*/
t.setPriority(10);//t.setPriority(Thread.MAX_PRIORITY);
t.getPriority();
//线程是否活着
t.isAlive();
//该线程是不是守护线程,main线程不能设置为守护线程
t.isDaemon();
//该线程有没有被打断
t.isInterrupted();
//获取该线程的状态
t.getState();
//等待该进程死亡
t.join();
//线程等待
t.wait();
//解除等待,唤醒
t.notify();