【Java多线程系列二】Thread类的方法
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类的方法的更多相关文章
- Java多线程系列二——Thread类的方法
Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...
- java多线程系列(二)
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- java多线程系列(二)---对象变量并发访问
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- java 多线程3:Thread类中的静态方法
Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...
- Java多线程原理及Thread类的使用
一.进程与线程的区别 1.进程是应用程序在内存总分配的空间.(正在运行中的程序) 2.线程是进程中负责程序执行的执行单元.执行路径. 3.一个进程中至少有一个线程在负责进程的运行. 4.一个进程中有多 ...
- (Java多线程系列二)线程间同步
Java多线程间同步 1.什么是线程安全 通过一个案例了解线程安全 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果. 先来看一个线程不安全的例子 class Sell ...
- java多线程2:Thread中的方法
静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...
- Java多线程系列五——列表类
参考资料: http://xxgblog.com/2016/04/02/traverse-list-thread-safe/ 一些列表类及其特性 类 线程安全 Iterator 特性 说明 Vect ...
- Java多线程系列九——Atomic类
参考资料:https://fangjian0423.github.io/2016/03/16/java-AtomicInteger-analysis/http://www.cnblogs.com/54 ...
随机推荐
- 08 java代码块的概述和分类
08.01_面向对象(代码块的概述和分类) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代 ...
- 如何更规范化的编写JAVA 代码
如何更规范的编写JAVA代码 一.MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失, ...
- yum update过程中失败后再次执行出现“xxxx is a duplicate with xxxx”问题
问题现象: 解决办法: 利用yum-uitls中的工具package-cleanup指令,使用方法见下图,具体可通过man package-cleanup查询 列出重复的rpm包 pac ...
- bootstrapTble 的一些小结
前言: 1.bootstrapTable 官网 http://bootstrap-table.wenzhixin.net.cn/zh-cn/ ,http://bootstrap-table.wenz ...
- MATLAB图像uint8,uint16,double, rgb转灰度解释
1.uint8,uint16与double 为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像.matlab读入图像的数据是uint8 ...
- spark性能调优01-常规调优
1.分配更多的资源 1.1 分配的资源有:executor.cup per executor.memory per executor.driver memory 1.2 如何分配:在spark-sub ...
- ARC103
ARC103E Tr/ee 首先没有叶子显然不科学,\(s_n\)是1也不怎么科学,\(s_i != s_{n-i}\)同样不怎么科学 特判掉上述情况后先把root记为1,链接(root,i+1)如果 ...
- CentOS6.5下面OpenSSH低版本升级至7.3
升级前版本: openssl-1.0.1e-48.el6_8.1.x86_64 openssh-5.3p1-118.1.el6_8.x86_64 升级后版本: OpenSSL 1.0.2j OpenS ...
- C语言交换两个数的值
#include<stdio.h> int main() { //交换两个数的值 // 方法一 可读性最好 ; ; int temp ; temp = a; a = b; b = temp ...
- celery使用多队列
生产者: 文件1: 定义任务 #!/usr/bin/env python3 # coding: utf-8 from celery import Celery import settings pw = ...