Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中线程失效的模拟_Java_Multithreading_Threadpool - Fatal编程技术网

Java中线程失效的模拟

Java中线程失效的模拟,java,multithreading,threadpool,Java,Multithreading,Threadpool,作为大学作业的一部分,我正在做一些事情,部分问题是模拟线程故障。对于上下文,我使用来自JavaSE的executor服务 我环顾了SO和谷歌,但还没有找到任何具体或具体的方法来做类似的事情 是否有人知道或拥有关于如何进行此操作的信息或指导的良好来源?如果您想测试线程在遇到异常时如何“失败”,您可以实现一个可运行的,您可以命令它失败: public class FailingRunnable implements Runnable { private volatile boolean d

作为大学作业的一部分,我正在做一些事情,部分问题是模拟线程故障。对于上下文,我使用来自JavaSE的executor服务

我环顾了SO和谷歌,但还没有找到任何具体或具体的方法来做类似的事情


是否有人知道或拥有关于如何进行此操作的信息或指导的良好来源?

如果您想测试线程在遇到异常时如何“失败”,您可以实现一个
可运行的
,您可以命令它失败:

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。谁将设置中断标志?