




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第详解Java线程中常用操作目录线程的常用操作守护线程(后台线程)线程串行化线程优先级线程中断
线程的常用操作
设置线程名字:setName()
获取线程名称:getName()
线程唯一Id:getId()
//
自定义线程名称
String
threadName
=
"threadName";
//
构造方法方式
Thread
thread
=
new
Thread(()
-
{
System.out.println("线程名="
+
Thread.currentThread().getName());
},threadName);
//
set方法方式
//
thread.setName(threadName);
System.out.println("线程唯一Id="
+
thread.getId());
线程启动:start()
判断线程是否存活:isAlive()
//
线程启动
thread.start();
System.out.println("是否为存活线程="
+
thread.isAlive());
线程方法:run()/call()
线程启动后会去调用的方法。线程要做什么就在run/call方法写,不需要直接调用,线程启动后自己会去调用run()/call()。如果程序没有启动线程直接调用run/call,那么就不属于多线程编程,是属于当前线程直接调用普通方法一样。
获取当前线程对象:currentThread()
操作当前线程的非static方法,得先拿到线程对象才可以
//
获取当前线程对象
Thread
currentThread
=
Thread.currentThread();
//
对当前线程做一些操作
System.out.println(currentThread.getName());
try
{
//
sleep
静态方法则不需要
Thread.sleep(1000);
}
catch
(InterruptedException
e)
{
e.printStackTrace();
关于线程的状态控制(生命周期)的操作可以参考上一篇文章。
守护线程(后台线程)
普通线程(用户线程)的守护者,守护线程的任务是为其他的线程提供服务。如果进程中没有了用户线程,那么守护线程也就没有存在的意义,JVM也随之结束。典型的守护线程有JVM的垃圾回收线程,操作系统的启动也会启动各种模块的守护线程。
设置线程为守护线程:setDaeman()
注意:该方法必须在start()方法之前调用
public
static
void
main(String[]
args)
{
Thread
thread
=
new
Thread(()
-
{
System.out.println("线程名="+Thread.currentThread().getName());
try
{
Thread.sleep(1000);
}
catch
(InterruptedException
e)
{
e.printStackTrace();
}
//
这一句不会打印出来,因为main线程(目前唯一的普通线程)等待1秒后已经结束了
System.out.println("守护线程的状态="
+
Thread.currentThread().getState());
});
//
守护线程
thread.setDaemon(true);
//
线程启动
thread.start();
System.out.println("是否为守护线程="
+
thread.isDaemon());
线程串行化
执行join()方法的线程进入等待唤醒状态(WAITING),直到调用该方法的线程结束后再由等待唤醒状态转为可运行状态(RUNNABLE)。join()方法是Thread类中的方法,其底层是使用wait()方法来实现线程等待,待线程isAlive()为false时才
实现线程的串行化:一个线程调用另一个线程对象的join()来实现线程串行化执行。
举个例子:一道好菜
public
class
DemoCooking
{
public
static
void
main(String[]
args)
{
Thread
mainThread
=
Thread.currentThread();
//
1.买菜
Thread
buyThread
=
new
Thread(new
CookingThread(mainThread,"买菜"),"buyThread");
//
2.洗菜
Thread
washThread
=
new
Thread(new
CookingThread(buyThread,"洗菜"),"washThread");
//
3.切菜
Thread
cutThread
=
new
Thread(new
CookingThread(washThread,"切菜"),"cutThread");
//
4.炒菜
Thread
scrambleThread
=
new
Thread(new
CookingThread(cutThread,"炒菜"),"scrambleThread");
//
不受线程启动顺序的影响
scrambleThread.start();
washThread.start();
cutThread.start();
buyThread.start();
//main线程先执行完才可以开始:买菜
System.out.println("开始准备……");
}
public
static
class
CookingThread
implements
Runnable{
private
final
Thread
thread;
private
final
String
job;
public
CookingThread(Thread
thread,
String
job){
this.thread
=
thread;
this.job
=
job;
}
@Override
public
void
run()
{
String
name
=
Thread.currentThread().getName()+":";
try
{
thread.join();
System.out.println(name
+
job
+
"开始");
Thread.sleep(1000);
System.out.println(name
+
job
+
"结束");
Thread.sleep(1000);
//
偷懒下
}
catch
(InterruptedException
e)
{
e.printStackTrace();
}
}
}
执行结果:mainbuyThreadwashThreadcutThreadscrambleThread结束
开始准备
buyThread:买菜开始
buyThread:买菜结束
washThread:洗菜开始
washThread:洗菜结束
cutThread:切菜开始
cutThread:切菜结束
scrambleThread:炒菜开始
scrambleThread:炒菜结束
线程优先级
设置当前线程的优先级,线程优先级越高,线程可能获得执行的次数越多,Java线程的优先级用整数表示,优先级的范围为1-10,默认为5。
setPriority(int)方法:设置线程的优先级。
getPriority方法:获取线程的优先级。
public
static
void
main(String[]
args)
{
Thread
thread
=
new
Thread(()
-
{
System.out.println("线程1");
});
thread.setPriority(10);
Thread
thread1
=
new
Thread(()
-
{
System.out.println("线程2");
});
thread1.setPriority(1);
thread.start();
thread1.start();
System.out.println("线程默认的优先级为="
+
Thread.currentThread().getPriority());
线程中断
使用interrupt()方法设置线程中断标志=true,让线程受到阻塞时抛出一个中断信号。如果线程处于阻塞、等待唤醒或超时等待状态(Object.wait,Thread.join和Thread.sleep)时,那么它将接收到一个中断异常(InterruptedException),从而提前被结束该状态。反之,如果线程是处于可运行(RUNNABLE)状态,那么中断标志将没有作用。
案例一:线程中断有效
public
static
void
main(String[]
args)
{
Thread
thread
=
new
Thread(()
-
{
System.out.println("线程1");
try
{
//
闹钟1分钟后响
Thread.sleep(60000);
System.out.println("闹钟响了");
}
catch
(InterruptedException
e)
{
//
提前退出超时等待状态
System.out.println("发生异常,提前醒了,闹钟没响手动关了");
}
System.out.println("继续执行该线程的后续程序……");
});
thread.setPriority(1);
thread.start();
errupt();
System.out.println("main线程将thread
终端状态设置为
"+thread.isInterrupted());
执行结果:
main线程将thread终端状态设置为true
线程1
发生异常,提前醒了,闹钟没响手动关了
继续执行该线程的后续程序
案例二:线程中断无效
public
static
void
main(String[]
args)
{
Thread
thread1
=
new
Thread(()
-
{
System.out.println("线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 郑州软件职业技术学院《数字电子技术基础A》2023-2024学年第二学期期末试卷
- 平顶山工业职业技术学院《普通话与教师语言规范》2023-2024学年第二学期期末试卷
- 杭州职业技术学院《民用建筑工程调研实训》2023-2024学年第二学期期末试卷
- 烟台城市科技职业学院《太极养生俱乐部》2023-2024学年第二学期期末试卷
- 石家庄铁道大学《电路与电子基础》2023-2024学年第二学期期末试卷
- 上海电机学院《数学教学与实践》2023-2024学年第二学期期末试卷
- 上海第二工业大学《数据挖掘技能训练》2023-2024学年第二学期期末试卷
- 辽宁商贸职业学院《地球科学概论》2023-2024学年第二学期期末试卷
- 广东云浮中医药职业学院《系统节能》2023-2024学年第二学期期末试卷
- 广州现代信息工程职业技术学院《早期接触临床》2023-2024学年第二学期期末试卷
- 《中医学》消渴-课件
- 向政府写诉求书范文(精选12篇)
- 电视节目策划学胡智峰
- 认识自我 悦纳自我 课件- 高中生心理健康主题班会
- 科技成果-秸秆清洁制浆及其废液肥料资源化利用技术
- 《社区治理研究国内外文献综述(1900字)》
- 烟花爆竹事故应急处置
- 《马克思主义与社会科学方法论》课件第四讲 社会矛盾研究方法
- 会宝岭选矿厂集中控制技术方案
- 生产车间如何节能减耗(课堂PPT)
- 2021译林版高中英语选择性必修四单词表
评论
0/150
提交评论