我有一个扩展另一个的线程。在超类中,有两种方法可以打印出有关线程的简单数据。扩展这个超类的线程也调用了我的问题这两个方法。我希望将这两个方法生成的所有数据输出到输出文件,但是由于我的超类扩展了线程类,它实现了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
任何有关这种情况的工作都将受到赞赏。
答案 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}}获取该例外。