前言
当一个程序包含多个线程并且这些线程都启动时,这些线程则是并发执行的,如:
目录
一、获取线程实例
关于获取线程实例有6种方法,本文只讲解4种(基于Callable、基于线程池 本文暂时不讲解)
(一)继承Thread类
class 类名 extends Thread{
@Override
public void run() {
//代码块
}
}
(二)实现Runnable接口
class 类名 implements Runnable{
@Override
public void run() {
//代码块
}
}
(三)匿名内部类
(1)创建Tread子类对象
Thread t = new Thread(){
@Override
public void run() {
//代码块
}
};
(2)创建Runnable子类对象
Thread t = new Thread(new Runnable() {
@Override
public void run() {
//执行
}
});
(四)Lambda表达式
Thread t = new Thread(()->{
//代码块
});
二、线程创建
线程创建又称为“线程启动”。
线程实例.start();
当start() 被执行,该线程就会启动,直到执行完毕。当线程在运行时,我们可以通过jconsole.exe文件进行查看线程运行情况:
未命名的用户创建的线程默认为Thread-0、 Thread-1、Thread-2....
三、线程中断
中断线程又名“终止线程”,是指让线程尽快结束,而不是打断线程后不让其继续进行执行。
(一)interrupt
线程实例.interrupt();
例如:
线程t 应该在执行while 死循环,但是因为main线程中出现了 t.interrupt();也就是在main线程中打断了线程t 的sleep休眠操作,使其抛出异常,继续往下执行,main线程执行完代码块之后也执行完毕,此时线程t 继续循环执行。
(二)标志位
(1)自定义标志位
如图中,count 就是一个自定义标志位。
对于多线程中的标志位,尽量使用volatile 修饰(后面的文章中会解释)。
也可以使用final修饰的常量来作为标志位,或者是不会被修改的变量。
(2)Thread 提供的标志位
Thread 提供了两个标志位,一个是成员方法,一个是静态方法。
1.Thread.currentThread().isInterrupted() (成员方法)-> 不清除标志位
2.Thread.interrupted() (静态方法)-> 清除标志位
在判断标志位时,会清除标志位
四、线程等待
线程对象.join();
public void join() | 等待线程结束 |
public void join(long m) | 等待线程结束,最多等m毫秒 |
public void join(long m,int n) | 等待线程结束,最多等m毫秒+n纳秒 |
有A 、B 两个线程,希望B线程先结束,A线程后结束,在A线程中调用B.join() 。
如果B线程还没执行完,A会进入阻塞状态直到B执行完成,A再从阻塞状态恢复回来,并且继续往后执行。
五、线程休眠
Thread.sleep(1000);
sleep() 当中的单位是毫秒,该方法是Thread 的静态方法。
结语
这篇博客如果对你有帮助,给博主一个免费的点赞以示鼓励,欢迎各位🔎点赞👍评论收藏⭐,谢谢!!!