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. Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)

    浏览器及驱动下载 进行web UI 自动化时,需要安装浏览器驱动webdriver,Chrome浏览器需要安装chromedriver.exe 驱动,Firefox需安装 geckodriver.ex ...

  2. 使用LoadRunner监控Apache

    前提本文使用的是lampp环境下自带的Apache服务 一.查看文件 查看文件确保目录中有Apache,我在这里使用的是用xampp自带apache [root@besttest ~]# ll 二.配 ...

  3. git清理工作区

    git clean -f 这将删除所有未被追踪的文件 git rev-list

  4. python-函数-动态传参,作用域的问题,函数嵌套,global nonlocal

    ⼀. 函数参数--动态传参 之前我们说过了传参, 如果我们需要给⼀个函数传参, ⽽参数⼜是不确定的. 或者我给⼀个 函数传很多参数, 我的形参就要写很多, 很⿇烦, 怎么办呢. 我们可以考虑使⽤动态参 ...

  5. datetime中strptime用法

    import datetime day20 = datetime.datetime.strptime('2020-01-01 0:0:0', '%Y-%m-%d %H:%M:%S')nowdate = ...

  6. Spring整合Hibernate报错:annotatedClasses is not writable or has an invalid setter method

    Spring 整合Hibernate时报错: org.springframework.beans.factory.BeanCreationException: Error creating bean ...

  7. MySQL-技术专区-数据库权限管理

    前言 学习mysql数据库,对于它的权限的管理是关键的一环.所以,下面介绍的是MySQL权限的管理. MySQL权限表 MySQL数据库实际上是通过将用户写入mysql库中对应的权限表来控制访问权限的 ...

  8. vue组件库的基本开发步骤(源代码)

    上次发布的随笔忘记提供源代码了,今天特地来补充,如果有什么问题,欢迎大家为我修改指正. vue.config.js文件: const path = require('path') function r ...

  9. Vue开发环境安装并集成element-ui示例

    此文为转载,原文链接:https://blog.csdn.net/weixin_44670973/article/details/88871106 在此对原文中部分内容进行补充. 补充:element ...

  10. react 16.3+ 新生命周期 作业

    1.有哪些⽣命周期被舍弃(3个),哪些⽣命 周期是新增(2个)? componentWillMount().componentWillReceiveProps().componentWillUpdat ...