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类的常用方法的更多相关文章

  1. 创建多线程的方式&Thread类的常用方法

    创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ...

  2. Thread类的常用方法_获取线程名称的方法和设置线程名称的方法

    Thread类的常用方法 获取线程的名称: 1.使用Thread类中的方法getName() String getName() 返回该线程的名称 2.可以先获取到当前正在执行的线程,使用线程中的方法g ...

  3. Thread类的常用方法----多线程基础练习

    创建多线程程序的第一种方式----继承Thread类 常用API 构造方法 public Thread() :分配一个新的线程对象. public Thread(String name) :分配一个指 ...

  4. Thread类的常用方法_获取线程名称的方法和Thread类的常用方法_设置线程名称的方法

    构造方法: public Thread();分配一个新的线程对象 public Thread(String name);分配一个指定名字的新的线程对象 public Thread(Runnable t ...

  5. Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口

    sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就 ...

  6. Thread类的常用方法_sleep和创建多线程程序的第二种方式实现Runnable接口

    public static void sleep(long millis);//使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行). 毫秒数结束后线程继续执行 package com.yang.T ...

  7. 34. Thread类的常用方法

    1.构造方法 Thread() 分配新的 Thread 对象. Thread(String name)  分配新的 Thread 对象并指定线程名字 2.方法 1)setName(String nam ...

  8. 线程操作之Thread类

    在.Net fremework 中,所有与线程有关的操作都封装在System.Thread命名空间中, 所以在操作线程时,要先引入次命名空间 Thread类的常用方法 Abort 线程终止 Join ...

  9. 【C#多线程】1.Thread类的使用及注意要点

    Thread随便讲讲 因为在C#中,Thread类在我们的新业务上并不常用了(因为创建一个新线程要比直接从线程池拿线程更加耗费资源),并且在.NET4.0后新增了Task类即Async与await关键 ...

随机推荐

  1. flask上下文全局变量,程序上下文、请求上下文、上下文钩子

    Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...

  2. c# 定义委托和使用委托(事件的使用)

    使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任何类或者结 ...

  3. MySQL存储引擎MyISAM与InnoDB区别总结整理

    在MySQL的 可重复读隔离级别 中,是解决了幻读的读问题的. 1. MySQL默认存储引擎的变迁 在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默 ...

  4. Inernet TLS协议注册表 开启

    IE高级配置中,存在SSL支持协议,例如SSL TLS. 其在注册表的路径为:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\I ...

  5. js中使用0 “” null undefined {}需要注意

    注意:在js中0为空(false) ,代表空的还有“”,null ,undefined: 如果做判断if(!上面的四种值):返回均为false console.log(!null);// true c ...

  6. Spring 注入的两种方式

    Spring 的两种注入方式: 1. 属性注入:通过无参构造函数+setter方法注入 2. 构造注入:通过有参的构造函数注入. 优缺点: 1. 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造 ...

  7. pat 团体赛练习题集 L2-008. 最长对称子串

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...

  8. Golang的值类型和引用类型的范围、存储区域、区别

    常见的值类型和引用类型分别有哪些? 值类型:基本数据类型 int 系列, float 系列, bool, string .数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变 ...

  9. php操作共享内存shmop类及简单使用测试(代码)

    SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段.在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码.可以使用 3 ...

  10. django ORM模型表的一对多、多对多关系、万能双下划线查询

    一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...