Thread类的常用方法
String getName() 返回该线程的名称。
void setName(String name) 改变线程名称,使之与参数 name 相同。
int getPriority() 返回线程的优先级。
void setPriority(int newPriority) 更改线程的优先级。
boolean isDaemon() 测试该线程是否为守护线程。
void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。
static void sleep(long millis)
void interrupt() 中断线程。
static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
void join() 等待该线程终止。
void run()
void start()
从Object类继承来的方法 void notify() void wait()
sleep阻塞
Thread.sleep(times)使当前线程从Running状态放弃处理器进入Block状态,休眠times毫秒,再返回Runnable状态。
new Thread(new Runnable() {
@Override
public void run() {
SimpleDateFormat format=new SimpleDateFormat("hh:mm:ss");
//输出系统时间的时分秒。每隔一秒显示一次。可能会出现跳秒的情况,因为阻塞1秒过后进入runnable状态,等待分配时间片进入running状态后还需要一点时间
while(true){
try {
Thread.sleep(1000); } catch (InterruptedException e) {
e.printStackTrace(); }
System.out.println(format.format(new Date()));
}
}
}).start();
注意:当一个线程处于睡眠阻塞时,若被其他线程调用.interrupt方法中断,则sleep方法会抛出InterruptedException异常
public static void main(String[] args) {
/*
* 表演者:处于睡眠阻塞的线程。
* 当一个方法中的局部内部类中需要引用该方法的其他局部变量,那么这个变量必须是final的
*/
final Thread lin = new Thread() {
public void run() {
System.out.println("林:刚美完容,睡觉吧!");
try{
// 当一个线程处于睡眠阻塞时,若被其他线程调用interrupt()方法中断,则sleep()方法会抛出 InterruptedException异常
Thread.sleep(100000000);
}
catch(InterruptedException e){
System.out.println("林:干嘛呢!都破了相了!");
}
}
};
/*
* 表演者:中断睡眠阻塞的线程
*/
Thread huang = new Thread() {
public void run() {
System.out.println("黄:开始砸墙!");
for(int i = 0; i < 5; i++){
System.out.println("黄:80!");
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
}
}
System.out.println("咣当!");
System.out.println("黄:搞定!"); // 中断lin的睡眠阻塞
lin.interrupt();
}
};
lin.start();
huang.start();
}
后台线程
后台线程的特点:用法与前台线程无异,只是当一个进程中所有前台线程都结束后,无论后台线程是否还处于运行中都将被强制结束,从而使得进程结束程序退出。
后台线程也称为:守护线程。精灵线程。
在运行程序时,操作系统会启动一个进程来运行jvm,jvm运行后会创建第一个前台线程来运行我们程序的main方法。同时也会创建一个后台线程运行GC。
public static void main(String[] args) { // Rose,表演者:前台线程
Thread rose = new Thread() {
public void run() {
for(int i = 0; i < 10; i++){
System.out.println("rose:let me go!");
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println("rose:啊啊啊啊AAAAAAaaaaaa....");
System.out.println("噗通!");
}
}; // jack,表演者:后台线程
Thread jack = new Thread() {
public void run() {
while(true){
System.out.println("jack:you jump!i jump!");
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}; /*
* 设置为后台线程
* 设置后台线程的方法要在该线程被调用start()方法之前调用
*/
jack.setDaemon(true);
rose.start();
jack.start();
}
线程的优先级
优先级被划分为1-10,1最低10最高。优先级越高的线程被分配时间片的机会越多,那么被CPU执行的机会就越多。
public static void main(String[] args) {
// 最高优先级的线程
Thread max = new Thread() {
public void run() {
for(int i = 0; i < 1000; i++){
System.out.println("max");
}
}
};
// 最低优先级的线程
Thread min = new Thread() {
public void run() {
for(int i = 0; i < 1000; i++){
System.out.println("min");
}
}
};
// 默认优先级的线程
Thread norm = new Thread() {
public void run() {
for(int i = 0; i < 1000; i++){
System.out.println("norm");
}
}
};
// void setPriority(int p),设置当前线程的优先级, 最高,最低,默认都有常量对应。
// 设置了优先级也不能100%控制线程调度。只是最大程度的告知线程调度以更多的几率分配时间片给线程优先级高的线程
max.setPriority(Thread.MAX_PRIORITY);
min.setPriority(Thread.MIN_PRIORITY);
// 这项设置可以省略,默认情况下就是该值
norm.setPriority(Thread.NORM_PRIORITY); min.start();
norm.start();
max.start();
}
join方法
/**
* 线程的协同工作 join方法
*/
public class Demo { // 判断照片是否下载完成
public static boolean isFinish = false; public static void main(String[] args) {
// 下载图片的线程
final Thread download = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("download:开始下载图片");
for(int i = 0; i <= 100; i++){
System.out.println("download:已完成" + i + "%");
try{
Thread.sleep(50);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println("download:图片下载完毕");
isFinish = true;
}
});
download.start(); // 用于显示图片的线程
Thread showImg = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("show:准备显示图片");
// 等待下载线程工作结束后,再执行下面的代码,
try{
// 此时显示图片的线程就进入阻塞状态,等待download线程运行结束,才能执行下面的代码。注意千万不要在永远也死不了的线程上等待
download.join();
}
catch(InterruptedException e){
e.printStackTrace();
}
if(!isFinish){
throw new RuntimeException("show:图片还没有下载完");
}
System.out.println("show:图片显示完成!");
}
});
showImg.start();
} }
wait()、notify()方法
/**
* 使用wait()与notify()方法完成线程协同工作
*/
public class Demo { public static boolean isFinish = false;
public static Object object = new Object(); public static void main(String[] args) { // 下载图片的线程
final Thread download = new Thread() {
public void run() {
System.out.println("download:开始下载图片");
for(int i = 0; i <= 100; i++){
System.out.println("download:已完成" + i + "%");
try{
Thread.sleep(50);
}
catch(InterruptedException e){
}
}
System.out.println("download:图片下载完毕");
isFinish = true;// 表示图片下载完毕了 // 当图片下载完毕后,就可以通知showImg开始显示图片了
synchronized(object){
// 通知在object身上等待的线程解除等待阻塞
object.notify();
} System.out.println("download:开始下载附件");
for(int i = 0; i <= 100; i++){
System.out.println("download:已完成" + i + "%");
try{
Thread.sleep(50);
}
catch(InterruptedException e){
}
}
System.out.println("download:附件下载完毕");
} }; // 用于显示图片的线程
Thread showImg = new Thread() {
public void run() {
System.out.println("show:准备显示图片");
// 等待下载线程将图片下载结束后,再执行下面的代码
try{
// wait()阻塞会在以下两种情况被解除,1:当download线程结束. 2:当调用了download的notify()
synchronized(object){
object.wait();
}
}
catch(InterruptedException e){
e.printStackTrace();
}
if(!isFinish){
throw new RuntimeException("图片没有下载完毕");
}
System.out.println("show:图片已经显示了!");
}
}; download.start();
showImg.start();
}
}
Thread类的常用方法的更多相关文章
- 创建多线程的方式&Thread类的常用方法
创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ...
- Thread类的常用方法_获取线程名称的方法和设置线程名称的方法
Thread类的常用方法 获取线程的名称: 1.使用Thread类中的方法getName() String getName() 返回该线程的名称 2.可以先获取到当前正在执行的线程,使用线程中的方法g ...
- Thread类的常用方法----多线程基础练习
创建多线程程序的第一种方式----继承Thread类 常用API 构造方法 public Thread() :分配一个新的线程对象. public Thread(String name) :分配一个指 ...
- Thread类的常用方法_获取线程名称的方法和Thread类的常用方法_设置线程名称的方法
构造方法: public Thread();分配一个新的线程对象 public Thread(String name);分配一个指定名字的新的线程对象 public Thread(Runnable t ...
- Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口
sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就 ...
- Thread类的常用方法_sleep和创建多线程程序的第二种方式实现Runnable接口
public static void sleep(long millis);//使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行). 毫秒数结束后线程继续执行 package com.yang.T ...
- 34. Thread类的常用方法
1.构造方法 Thread() 分配新的 Thread 对象. Thread(String name) 分配新的 Thread 对象并指定线程名字 2.方法 1)setName(String nam ...
- 线程操作之Thread类
在.Net fremework 中,所有与线程有关的操作都封装在System.Thread命名空间中, 所以在操作线程时,要先引入次命名空间 Thread类的常用方法 Abort 线程终止 Join ...
- 【C#多线程】1.Thread类的使用及注意要点
Thread随便讲讲 因为在C#中,Thread类在我们的新业务上并不常用了(因为创建一个新线程要比直接从线程池拿线程更加耗费资源),并且在.NET4.0后新增了Task类即Async与await关键 ...
随机推荐
- 虚拟机连不上网 Xshell连不上虚拟机
以centos7 为例 1,确定network connection 为NAT 2, 打开网络连接中心 Control Panel\Network and Internet\Network Conne ...
- Spring 无缝整合 quartz
关键步骤: 1. 配置 SchedulerFactoryBean <bean class="org.springframework.scheduling.quartz.Schedule ...
- 设计模式之Singleton(单态)(转)
定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有, singleton能够被状 ...
- loadRunner回访脚本时报Error -27987: Requested image not found [MsgId: MERR-27987]
loadRunner录制:登陆订机票网址->订机票的过程 loadRunner回访脚本时报Error -27987: Requested image not found [MsgId: MER ...
- go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量
go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...
- Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中 ...
- tft屏图像显示也成功完成
2010-04-30 14:18:00 tft屏图像显示也成功完成. 其实有了刷屏的经验,图像显示就很简单. void address_set(uint x1,uint y1,uint x2,uint ...
- 初学delphi
今天女朋友的一门课,要求用delphi 软件编程,内容是一个计算器.当然,这个工作肯定是落在我的头上了. 这个软件是我第一次使用,边自学边进行代码编写,在n多次修改完善之后,终于成形.功能不是很多,跟 ...
- linux下的ifconfig命令
ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置. 1.命令格式: ifconfig [网络设备] [参数] 2.命令功能: ifconfig 命令用来查看和配置网络设 ...
- 知乎上一个比较好的学习QT的公众号<<跟小豆君学Qt>>
公众号网址:https://zhuanlan.zhihu.com/p/28472916