线程和异常投掷/处理

时间:2017-03-06 00:46:19

标签: java multithreading file-io exception-handling

我有一个扩展另一个的线程。在超类中,有两种方法可以打印出有关线程的简单数据。扩展这个超类的线程也调用了我的问题这两个方法。我希望将这两个方法生成的所有数据输出到输出文件,但是由于我的超类扩展了线程类,它实现了runnable。由于这个原因,我不能从线程运行方法中抛出任何异常,以便可能逐行打印到输出文件(即:throw IOException)。请记住,我希望逐行打印输出,而不是使用如下方法:

PrintStream out = new PrintStream(new FileOutputStream(" output4.txt"));
System.setOut(下);

我希望做一些事情,使用FileWriter和PrintWriter将BaseThread的每一行输出到一个文件(对于每个Thread实例)。

static class BaseThread extends Thread
{
    public synchronized void info1()
    {
    //print some thread data to an outputfile
    }
    public synchronized void info2()
    {
    //print some thread data to an outputfile
    }
}
public class CallMyThreads
{
     public static void main(String[]args)
     {
         Thread1 t1 = new Thread1();
         Thread1 t2 = new Thread1();

         t1.start();
         t2.start();

         t1.join();
         t2.join();
     }
 static class Thread1 extends BaseThread //inner class
 {
    public void run() // <--- Cannot throw exception here for IO
    {
       info1(); //wish for each instance to print this to a file(1 file all concatenated together for each thread)
       info2();//wish for each instance to print this to a file(1 file all concatenated together for each thread)
    }
 } //close Thread1
 }//close main thread

任何有关这种情况的工作都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

首先关闭:不要扩展Thread。有关详细信息,请参阅this question

最好实现Callable,这样可以抛出已检查的异常:

static class BaseThread { ... }

static class Thread1 extends BaseThread implements Callable<Void> //inner class
{
  @Override public Void call() throws IOException
  {
    info1();
    info2();
    return null;  // You have to return something from a Callable.
  }
}

现在您可以使用ExecutorService

调用此功能
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<?> f1 = executor.submit(new Thread1());
Future<?> f2 = executor.submit(new Thread1());
executor.shutdown();

f1.get();  // Instead of join.
f2.get();

Future.get()抛出了许多已检查的异常,但是其中一个是ExecutionException,表示执行期间发生了未捕获的异常;您可以从getCause()的{​​{1}}获取该例外。