Java中线程失效的模拟
作为大学作业的一部分,我正在做一些事情,部分问题是模拟线程故障。对于上下文,我使用来自JavaSE的executor服务 我环顾了SO和谷歌,但还没有找到任何具体或具体的方法来做类似的事情Java中线程失效的模拟,java,multithreading,threadpool,Java,Multithreading,Threadpool,作为大学作业的一部分,我正在做一些事情,部分问题是模拟线程故障。对于上下文,我使用来自JavaSE的executor服务 我环顾了SO和谷歌,但还没有找到任何具体或具体的方法来做类似的事情 是否有人知道或拥有关于如何进行此操作的信息或指导的良好来源?如果您想测试线程在遇到异常时如何“失败”,您可以实现一个可运行的,您可以命令它失败: public class FailingRunnable implements Runnable { private volatile boolean d
是否有人知道或拥有关于如何进行此操作的信息或指导的良好来源?如果您想测试线程在遇到异常时如何“失败”,您可以实现一个
可运行的,您可以命令它失败:
public class FailingRunnable implements Runnable {
private volatile boolean doFail = false;
@Override
public void run() {
while(!doFail && ! Thread.interrupted())
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
throw new RuntimeException("failed");
}
public void failOnNextOccasion() {
doFail = true;
}
}
在将runnable添加到executor之后,必须保留对它的引用,然后在任何给定时间调用runnable的方法failonNext()
。像这样:
ExecutorService execSrv = Executors.newFixedThreadPool(2);
FailingRunnable one = new FailingRunnable();
FailingRunnable two = new FailingRunnable();
execSrv.submit(one);
execSrv.submit(two);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
one.failOnNextOccasion();
two.failOnNextOccasion();
更复杂一点的线程出现故障,有一个不太明显的错误:
public class Test {
static class FailerThread implements Runnable {
final Object[] objects;
final Random random;
final int number;
public FailerThread(final Object[] objects, final int number) {
this.objects = objects;
this.random = new Random();
this.number = number;
}
@Override
public void run() {
final boolean isWriter = number % 2 == 0;
int index = random.nextInt(objects.length);
try {
while (Thread.interrupted() == false) {
synchronized (objects) {
if (isWriter) {
while (objects[index] == null) {
System.out.println(number + ": Index " + index + " is null, waiting...");
objects.wait();
}
for (int copyIndex = 0; copyIndex < objects.length; ++copyIndex) {
if (objects[copyIndex] == null) {
objects[copyIndex] = this.objects[index];
}
}
objects.notifyAll();
} else {
objects[index] = null;
}
}
++index;
if (index >= objects.length) {
index = 0;
}
}
} catch (InterruptedException e) {
}
}
}
public static void main(String[] args) throws InterruptedException {
final Object[] objects = new Object[10];
for (int i = 0; i < objects.length; ++i) {
objects[i] = new Object();
}
final int NUM_THREADS = 32;
final ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
for (int i = 0; i < NUM_THREADS; ++i) {
executor.execute(new FailerThread(objects, i));
}
}
}
公共类测试{
静态类FailerThread实现可运行{
最终目标[]目标;
最终随机;
最终整数;
public FailerThread(最终对象[]对象,最终整数){
this.objects=对象;
this.random=新的random();
这个数字=数字;
}
@凌驾
公开募捐{
最终布尔值isWriter=number%2==0;
int index=random.nextInt(objects.length);
试一试{
while(Thread.interrupted()==false){
已同步(对象){
if(isWriter){
while(对象[索引]==null){
System.out.println(number+“:Index“+Index+”为空,正在等待…”);
对象。wait();
}
对于(int-copyIndex=0;copyIndex=objects.length){
指数=0;
}
}
}捕捉(中断异常e){
}
}
}
公共静态void main(字符串[]args)引发InterruptedException{
最终对象[]对象=新对象[10];
对于(int i=0;i
它应该立即失败,但是原因很简单。你说的线程失败是什么意思?你是说你的Runnable
或Callable
在执行is操作时应该抛出异常?@SotiriosDelimanolis我的道歉,应该更清楚一些。我对这个问题的解释是,我需要在线程池中完成一项任务,这样就有可能随机失败。为了进一步澄清,这就是我得到的“模拟线程故障并实现适当的监视和恢复机制”。此外,我不想找人来做我的工作,只想了解一些想法或信息。因为我唯一能想到的是你的非定义线程故障,我想您可以创建一个类DummyThreadFailure
类,该类实现可运行
(或可调用
,具体取决于您使用什么),并抛出一个新的运行时异常(“虚拟线程故障”)
我认为您的意思是通过随机超时线程或简单地从包装在FutureTask中的可调用对象返回null来模拟失败。这是在线程池中模拟失败的最简单方法。例如,public类FailThread实现可调用的{@Override public boolean call(){if(Math.random())您正在检查try块中是否有中断标志,是否存在具有空catch块的interruptedeexception。谁将设置中断标志?