Thread实现Runnable接口并实现了大量实用的方法。

/*
* 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会
*/
public static native void yield(); /*
* 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将得到执行机会,在休眠时间结束后,当前线程继续执行
*/
public static native void sleep(long millis) throws InterruptedException; /*
* 一旦调用后宿主线程将阻塞,待当前线程结束后继续
*/
public final void join() throws InterruptedException; /*
* 一旦调用后宿主线程将阻塞,待当前线程结束后继续
*/
public final synchronized void join(long millis)throws InterruptedException; /*
* 中断线程
*/
public void interrupt(); /*
* on=true表示线程标记为守护线程(例如GC线程),若正在运行的所有线程都是守护线程,JVM将退出
*/
public final void setDaemon(boolean on);

Java代码:

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert;
import org.junit.Test; /**
* @Description: 测试Thread的方法
*/
public class ThreadMethodsTest { static String SLEEP = "sleep";
static String YIELD = "yield";
static String JOIN = "join"; private Map<String, ThreadMethodEnum> map = new ConcurrentHashMap<>(); class ThreadSleep implements Runnable {
private int millis; public ThreadSleep(int millis) {
this.millis = millis;
} @Override
public void run() {
System.out.println("Thread sleep run()...");
long threadId = Thread.currentThread().getId(); ThreadMethodEnum sleep = ThreadMethodEnum.SLEEP;
sleep.init(threadId); try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
sleep.stop();
map.put(sleep.getMethod(), sleep);
}
} class ThreadYield implements Runnable {
@Override
public void run() {
long threadId = Thread.currentThread().getId();
ThreadMethodEnum yield = ThreadMethodEnum.YIELD;
yield.init(threadId);
Thread.yield();
yield.stop();
map.put(yield.getMethod(), yield);
}
} class ThreadJoin implements Runnable {
private Thread thread;
private int millis = 0; public ThreadJoin(Thread thread) {
this.thread = thread;
} public ThreadJoin(Thread thread, int millis) {
this.thread = thread;
this.millis = millis;
} @Override
public void run() {
try {
System.out.println("Thread join run()...");
long threadId = Thread.currentThread().getId();
ThreadMethodEnum join = ThreadMethodEnum.JOIN;
join.init(threadId);
if (millis > 0) {
this.thread.join(millis);
} else {
this.thread.join();
}
join.stop();
map.put(join.getMethod(), join);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} final AtomicInteger interruptCount = new AtomicInteger(0);
final int interruptIndex = 100; class ThreadInterrupt extends Thread {
@Override
public void run() {
while (!isInterrupted()) {
interruptCount.incrementAndGet();
if (interruptCount.intValue() == interruptIndex) {
interrupt();
}
}
}
} @Test
public void testSleep() throws InterruptedException {
int millis = 1000;
Thread sleep = new Thread(new ThreadSleep(millis));
sleep.start();
sleep.join();
ThreadMethodEnum tme = map.get(SLEEP);
// 预期sleep时间与millis相近
Assert.assertEquals(1, Math.round((tme.getStopTimeMillis() - tme.getStartTimeMillis()) * 1.0 / millis));
} @Test
public void testYield() throws InterruptedException {
Thread yield = new Thread(new ThreadYield());
yield.start();
yield.join();
ThreadMethodEnum tme = map.get(YIELD);
// 预期yield消耗时间几乎为0
Assert.assertEquals(1, Math.round(tme.getStartTimeMillis() * 1.0 / tme.getStopTimeMillis()));
} @Test
public void testJoin() throws InterruptedException {
System.out.println("testJoin() ---- start----");
int millis = 1000;
Thread sleep = new Thread(new ThreadSleep(millis));
sleep.setName("Sleep Thread");
sleep.start();
Thread join = new Thread(new ThreadJoin(sleep));
join.setName("Join Thread");
join.start();
join.join();
ThreadMethodEnum tme = map.get(SLEEP);
// 预期sleep时间与millis相近
Assert.assertEquals(1, Math.round((tme.getStopTimeMillis() - tme.getStartTimeMillis()) * 1.0 / millis));
tme = map.get(JOIN);
// 预期join阻塞时间与millis相近
Assert.assertEquals(1, Math.round((tme.getStopTimeMillis() - tme.getStartTimeMillis()) * 1.0 / millis));
System.out.println("testJoin() ---- end----");
} @Test
public void testJoinMillis() throws InterruptedException {
System.out.println("testJoinMillis() ---- start----");
int millis = 500;
Thread sleep = new Thread(new ThreadSleep(millis * 2));
sleep.setName("Sleep Thread");
sleep.start();
Thread join = new Thread(new ThreadJoin(sleep, millis));
join.setName("Join Thread");
join.start();
join.join(); ThreadMethodEnum tme = map.get(SLEEP);
//预期sleep 不能在join阻塞结束前设置,固为null
Assert.assertTrue(tme == null); tme = map.get(JOIN);
//预期join阻塞时间与millis相近
Assert.assertEquals(1, Math.round((tme.getStopTimeMillis() - tme.getStartTimeMillis()) / millis));
System.out.println("testJoinMillis() ---- end----");
} @Test
public void testInterrupt() throws InterruptedException {
ThreadInterrupt interrupt = new ThreadInterrupt();
interrupt.start();
interrupt.join();
Assert.assertEquals(interruptIndex, interruptCount.intValue());
} } enum ThreadMethodEnum {
SLEEP(ThreadMethodsTest.SLEEP) {
@Override
public void init(long threadId) {
super.start(threadId);
}
},
YIELD(ThreadMethodsTest.YIELD) {
@Override
public void init(long threadId) {
super.start(threadId);
}
},
JOIN(ThreadMethodsTest.JOIN) {
@Override
public void init(long threadId) {
super.start(threadId);
}
}; private String method;
private long threadId;
private long startTimeMillis;
private long stopTimeMillis = 0; private ThreadMethodEnum(String method) {
this.method = method;
} public void stop() {
this.stopTimeMillis = System.currentTimeMillis();
} public String getMethod() {
return method;
} public long getThreadId() {
return threadId;
} public long getStartTimeMillis() {
return startTimeMillis;
} public long getStopTimeMillis() {
return stopTimeMillis;
} private void start(long threadId) {
this.threadId = threadId;
this.startTimeMillis = System.currentTimeMillis();
} public abstract void init(long threadId);
}

【Java多线程系列二】Thread类的方法的更多相关文章

  1. Java多线程系列二——Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...

  2. java多线程系列(二)

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  3. java多线程系列(二)---对象变量并发访问

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  4. java 多线程3:Thread类中的静态方法

    Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...

  5. Java多线程原理及Thread类的使用

    一.进程与线程的区别 1.进程是应用程序在内存总分配的空间.(正在运行中的程序) 2.线程是进程中负责程序执行的执行单元.执行路径. 3.一个进程中至少有一个线程在负责进程的运行. 4.一个进程中有多 ...

  6. (Java多线程系列二)线程间同步

    Java多线程间同步 1.什么是线程安全 通过一个案例了解线程安全 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果. 先来看一个线程不安全的例子 class Sell ...

  7. java多线程2:Thread中的方法

    静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...

  8. Java多线程系列五——列表类

    参考资料: http://xxgblog.com/2016/04/02/traverse-list-thread-safe/ 一些列表类及其特性  类 线程安全 Iterator 特性 说明 Vect ...

  9. Java多线程系列九——Atomic类

    参考资料:https://fangjian0423.github.io/2016/03/16/java-AtomicInteger-analysis/http://www.cnblogs.com/54 ...

随机推荐

  1. PouchContainer 容器技术演进助力阿里云原生升级

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 作者 | 杨育兵(沈陵) 阿里巴巴高级技术专家 我们从 2016 年开始在集团推广全面的镜像化容器化,今年是集团全面镜像化容器 ...

  2. 19. HTTP协议二:HTTP请求与响应、常见状态码

    HTTP请求与响应 HTTP请求 HTTP请求是指从客户端到服务器端的请求消息.HTTP请求主要由三部分构成,请求行.请求头(headers).body(请求数据). 上图是笔者用Charles抓包工 ...

  3. python学习笔记:接口开发——flask Demo实例

    举例1,返回当前时间接口 ''' 初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下用如下方法实 ...

  4. 爬虫(五)—— selenium模块启动浏览器自动化测试

    目录 selenium模块 一.selenium介绍 二.环境搭建 三.使用selenium模块 1.使用chrome并设置为无GUI模式 2.使用chrome有GUI模式 3.查找元素 4.获取标签 ...

  5. Findwind() Enumwindow()

    1. FindWindow() HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName); 功能:查找与指定窗口类名和窗口名称相匹配的顶级窗口, ...

  6. VS2008中编译运行MFC应用程序时,出现无法启动程序,因为计算机中丢失mfc90ud.dll的解决方案

     解决方法:"工具"->"选项"->"项目和解决方案"->"VC++目录",在可执行文件栏中加上如 ...

  7. 自定义input[type="radio"]

    对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 对单选按钮自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :c ...

  8. ScrollView嵌套listview显示一行bug

    首先看看修复bug之后的显示对比图,结果一目了然 显示一行之前 修改bug之后 主要就是ScrollView嵌套listview显示计算  直接上代码   一目了然 <com.wechaotou ...

  9. Shell: 文本文件操作

    文件显示和信息 wc wc 可以用于统计文件的行数和单词数. nl nl 在文件的每行内容前面加上行号. 基于行的操作 grep grep 用于筛选匹配特定字符的行. grep "Hello ...

  10. 【Jquery对象】jquery与dom对象的区别

    最近工作有很多判断的代码,用到了jquery与dom对象的地方比较多,写在这里加强下基本概念: 1.判断是否存在时候,要用dom对象,因为jQuery在获得对象的时候,无论要获得的对象是否存在,都会返 ...