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关键 ...
随机推荐
- Java基础语法(一 )
一.关键字 关键字概述 被Java语言赋予特定含义的单词 关键字特点 组成关键字的字母全部小写 关键字注意事项 goto和const作为保留字存在,目前并不使用 关键字单词 用于定义数据类型的关键字 ...
- Java将对象保存到文件中/从文件中读取对象
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
- APIView源码解析
1.首先安装pip install djangorestframework 2.导入from rest_framework.views import APIView class Courses(API ...
- 转:C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解
转载自:http://www.cnblogs.com/easyfrog/p/3141269.html using System; using System.Collections.Generic; u ...
- Step2:SQL Server 复制事务发布
一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...
- Kali linux创建和删除用户
#创建用户 图形界面如此友好,直接点用户——添加用户——设置密码即可,如果切换帐号,同样点用户——切换用户——输入密码即可. #删除用户的指令比较复杂一些,这里我们找到了特别好的资源,简明有效. ht ...
- pat 团体赛练习题集 L2-007. 家庭房产
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式给出一个人的房产: ...
- Django form choices, placeholder
item=CharField(max_length=20,min_length=1,required=True,widget=widgets.TextInput({'placeholder':'tes ...
- mybatis 3.2.*打印sql结果集
虽然可以写个interceptor记录下,但是总归没有log4j来的自然.一段时间不查问题,总是要忘了,记录下: 在mybatis 3.2.*中,可以在log4j中如下配置: log4j.logger ...
- squid代理服务器安装和配置
服务器版本:centos6.5 squid版本:3.1 Squid介绍 Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据.当一个用户想要下载一个主页时,可 ...