所以我有一个Java应用程序,它使用一个固定的线程池来执行一些代码。此代码包括使用输出到系统的第三方库。犯错误当我让这段代码执行单线程时,我“重定向”了系统。错误为最终打印到log4j日志的打印流。基本上是这样的:
PrintStream oldErr = System.err;
System.setErr(new PrintStream(/* custom logging stream here */));
try
{
// do computationally expensive task here
}
finally
{
System.setErr(oldErr);
}
这按预期工作。输出打印到日志文件而不是控制台,我可以通过更改log4j配置完全删除输出。完美。
当我开始添加多线程时,我做了一些研究,遇到了这样一个问题:在多线程Java程序中,每个线程是否都有自己的系统副本。出来这意味着我应该做系统。在启动线程池之前设置一次setErr(),我就一切就绪了。但情况似乎并非如此。我的代码现在如下所示:
PrintStream oldErr = System.err;
System.setErr(new PrintStream(/* custom logging stream here */));
ExecutorService threadPool = Executors.newFixedThreadPool(maxThreadCount);
try
{
// shove computationally expensive task off to a thread
// using threadPool.execute()
}
finally
{
System.setErr(oldErr);
}
然而,呼叫系统。启动线程池之前的setErr()无效。所有线程都将其输出打印到系统。好像我根本没有打过电话似的。该死!
我还尝试了线程调用系统。setErr()在执行任务时,但存在一些明显的争用条件问题——向控制台的间歇输出,以及一种普遍的肮脏感。在一次测试中,他们甚至看起来陷入僵局。
我错过了一些简单的东西吗?FWIW,以下是我的JVM详细信息:
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b17, mixed mode)
谢谢
编辑:我的问题基本上由公认的答案解决了,但为了完整性,我想补充一点,我无法使用Futures和get()来解决我的特殊情况。我的单个任务消耗了大量RAM,但持续时间各不相同,因此我不得不使用一个小的阻塞队列,如Java:ExecutorService的答案中所述,该队列在达到一定队列大小后在提交时阻塞。我基本上陷入了这样一个陷阱:我认为newFixedThreadPool()中的默认值适用于我的情况,而实际上它们并不适用,而Brian的回答帮助我暴露了这些错误的假设。谢谢Brian!
以下SSCCE正是您想要和期望的:
public class App
{
public static void main(String[] args) throws FileNotFoundException, InterruptedException, ExecutionException
{
PrintStream oldErr = System.err;
System.setErr(new PrintStream(new File("test")));
ExecutorService threadPool = Executors.newFixedThreadPool(5);
List<Future<?>> fList = new LinkedList<Future<?>>();
for (int i = 0; i < 5; i++)
{
fList.add(threadPool.submit(new Runnable() {
@Override
public void run()
{
System.err.println("This is to the err stream");
}
}));
}
for (Future<?> f : fList)
{
f.get();
}
threadPool.shutdown();
System.setErr(oldErr);
System.err.println("This is to the err stream");
}
}
运行此示例后,文件“test”包含5行,每行都表示“这是错误流”,最后会向控制台打印另外一行。
您显示的代码片段正在调用System.setErr(oldErr);
在
最后
块中...您是否在该try
块中等待所有任务完成?
如果没有,它将解释您在注释中所做的声明“我会看到输出的片段打印到System.err和片段打印到我的日志文件”...这几乎就是您所期望的。
。提交()
是一个非阻塞调用,返回Future
;您正在运行任务时重置流。
问题内容: 这个想法是使用更少的连接和更好的性能。连接是否随时终止? 对于另一个问题,是否打开新连接? 问题答案: 不,多路复用器不会过期。没有GetDatabase不会打开新连接。basics.md涵盖了所有内容 -特别是: 从GetDatabase返回的对象是便宜的直通对象,不需要存储。
我有一个使用jquery mobile的应用程序,它由几个html页面组成,每个页面中都有几个jquery页面元素。在桌面浏览器上,一切正常,但当我把它加载到我的android设备(运行2.3)上时,第一个页面看起来很好,但只要你点击一个链接(比如从index.html)- 那么,是否有正确的方法在不同的html页面之间移动呢?我没有得到任何浏览器错误,所以一切似乎都工作正常,但没有jqm的样式或
问题内容: 我正在尝试对表单中的某些字段使用get_or_create,但尝试这样做时却出现500错误。 其中一行如下所示: 对于以上代码,我得到的错误是: 问题答案: 从文档get_or_create中: 说明: 要评估相似性的字段必须在外部提及。其余字段必须包含在中。如果发生CREATE事件,则会考虑所有字段。 看起来你需要返回一个元组,而不是单个变量,请执行以下操作:
我正在使用IntentService将图像上传到服务器。我的问题是我不知道如何/何时停止服务。当我在onHandleIntent(意图..)中调用stopself()时将删除在IntentService队列中等待的所有意图。但我不想停止活动中的服务,因为我想完成上传过程,即使我的应用程序没有运行。
4.5 正确的关机方法 OK!大概知道开机的方法,也知道基本的指令操作,而且还已经知道线上查询了,好累呦! 想去休息呢!那么如何关机呢?我想,很多朋友在DOS的年代已经有在玩计算机了! 在当时我们关掉DOS的系统时,常常是直接关掉电源开关,而 Windows 在你不爽的时候,按着电源开关四秒也可以关机!但是在Linux则相当的不建议这么做! Why?在 Windows (非 NT 主机系统) 系统
我们在我们的项目中使用连接池。我们在我们的项目中看到,在连接关闭后,语句也会关闭。我知道在连接池的情况下,连接关闭后,到数据库的物理连接不会关闭,而是返回到池进行重用。所以我的问题是: 如果在连接关闭后关闭语句会发生什么?语句是否会正确关闭/关闭连接是否会关闭所有语句,关闭语句是多余的/语句是打开的,尽管连接返回到池中,但由于打开语句,它是不可重用的?(我们同时使用Statement和Prepar