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. jQuery文档操作--append()、prepend()、after()和before()

       append(content|fn)  概述 向每个匹配的元素内部追加内容,这个操作与对指定的元素执行appendChild方法,将它们添加到文档中的情况类似 参数    content  要追 ...

  2. maven build 的时候,卡死在Downloading metadata的解决方法

    [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Buildi ...

  3. 了解一下UTF-16

    1)先啰嗦一下 UTF-16是一种编码格式.啥是编码格式?就是怎么存储,也就是存储的方式. 存储啥?存二进制数字.为啥要存二进制数字? 因为Unicode字符集里面把二进制数字和字符一一对应了,存二进 ...

  4. Hive静态分区和动态分区

    一.静态分区 1.创建分区表 hive (default)> create table order_mulit_partition( > order_number string, > ...

  5. (Review cs231n) Backpropagation and Neural Network

    损失由两部分组成: 数据损失+正则化损失(data loss + regularization) 想得到损失函数关于权值矩阵W的梯度表达式,然后进性优化操作(损失相当于海拔,你在山上的位置相当于W,你 ...

  6. Linux环境 vi/vim ESC无法退出原因

    原因是输入模式是中文的,需要切换成英文半角符号输入命令!

  7. Javascript原生之用cssText批量修改样式

    一般情况下我们用js设置元素对象的样式会使用这样的形式: var element= document.getElementById(“id”);element.style.width=”20px”;e ...

  8. 线程安全的CopyOnWriteArrayList

    证明CopyOnWriteArrayList是线程安全的 先写一段代码证明CopyOnWriteArrayList确实是线程安全的. ReadThread.java import java.util. ...

  9. GUI相应鼠标事件

    function varargout = GUI18(varargin) % GUI18 MATLAB code for GUI18.fig % GUI18, by itself, creates a ...

  10. emmm

    #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; st ...