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

public static native void yield();

此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会

public static native void sleep(long millis) throws InterruptedException;

此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将得到执行机会,在休眠时间结束后,当前线程继续执行

public final void join() throws InterruptedException;

一旦调用后宿主线程将阻塞,待当前线程结束后继续

public final synchronized void join(long millis)throws InterruptedException;

一旦调用后宿主线程将阻塞,待millis时间结束后继续

public void interrupt();

中断线程

public final void setDaemon(boolean on);

on=true表示线程标记为守护线程(例如GC线程),若正在运行的所有线程都是守护线程,JVM将退出

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 TheadSleep implements Runnable {
private int millis; public TheadSleep(int millis) {
this.millis = millis;
} @Override
public void 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 TheadYield 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 TheadJoin implements Runnable {
private Thread thread;
private int millis = 0; public TheadJoin(Thread thread) {
this.thread = thread;
} public TheadJoin(Thread thread, int millis) {
this.thread = thread;
this.millis = millis;
} @Override
public void run() {
try {
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 TheadSleep(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 TheadYield());
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 {
int millis = 1000;
Thread sleep = new Thread(new TheadSleep(millis));
sleep.start();
Thread join = new Thread(new TheadJoin(sleep));
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));
} @Test
public void testJoinMillis() throws InterruptedException {
int millis = 500;
Thread sleep = new Thread(new TheadSleep(millis * 2));
sleep.start();
Thread join = new Thread(new TheadJoin(sleep, millis));
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));
} @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);
}

最新文章

  1. LeedCode-Two Sum
  2. 纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器)
  3. MyBatis魔法堂:即学即用篇
  4. QT打开ROS工作空间时遇到的问题和解决方法
  5. [div+css]网站布局实例二
  6. 查看各个release版本 golang的改动
  7. FileOutputStream
  8. 在美国公司架构中,LLC、LLP 和 Corporation 的区别何在?
  9. Singleton 单例模式 泛型 窗体控制
  10. errorPlacement的位置问题
  11. Powershell Mail module, 发送outbox 里的全部邮件(一个.csv文件代表一封邮件)
  12. python socket服务器进行远程升级
  13. python3 selenium 切换窗口的几种方法
  14. blob 和 sas
  15. Ceph和Openstack的cinder模块对接方法
  16. 如何在Eclipse CDT中编译含有多个main函数的项目
  17. [物理学与PDEs]第1章习题5 偶极子的电场强度
  18. 关于mysql存储过程中传decimal值会自动四舍五入的这个坑
  19. Java Web(十一) 分页功能的实现
  20. python webdriver 从无到有搭建数据驱动自动化测试框架的步骤和总结

热门文章

  1. python+selenium之元素的八大定位方法
  2. windows窗口过程函数名词解析
  3. [bzoj3531][Sdoi2014][旅行] (主席树+树链剖分)
  4. Python基础—线程、进程和协程
  5. 判断List集合为空
  6. cf 55D 数位dp 好题
  7. [K3Cloud] QueryService使用注意事项
  8. 【BZOJ2440】完全平方数(莫比乌斯函数,容斥原理)
  9. Web App 响应式页面制作 笔记整理
  10. Remove Duplicates from Sorted Array(参考)