我刚刚开始涉及并发,所以如果我问一些明显/愚蠢的事情,请耐心等待。我正在尝试采取第一步来改进我必须利用Java货币的模型。在没有详细说明的情况下,我有一部分模型加载了一些文件,然后在给定请求时它返回文件上的一些相应数据。我的挑战是让它现在运行在它自己的线程上,这样虽然它一次只处理一个请求,但它可以排队请求使代码的其他部分在自己的线程上运行。
在尝试通过jenkov.com上的精彩教程自学并发后,我使用了我学到的东西并且基本上创建了一些类似于BlockingQueue的东西,其中有一个对象充当锁,其中请求以排队的线程进入,当当前线程完成处理时,它将解锁下一个线程。因此,线程不断被创建,进入等待,启动,然后最终被破坏,因为每个请求都是新线程。
我现在想到的是,它更像我最初描绘的那样,只有一个线程等待指令,然后处理这些指令。因此,不是作为线程进入的请求,而是有一些单独的线程等待它有一个请求,处理它,处理排队的任何其他请求,如果没有,再等待。 (假设的)优势是请求作为变量/教师进入,并且不会不断地创建/销毁线程。
所以问题是重写它更像是有优势吗?我知道创建/销毁线程可能不会产生大量开销(只要我使用wait / notify函数而不是说忙碌等待)但这是一种必须运行数百万的模型在这种情况下,有时甚至是边际收益都会成倍增加。
答案 0 :(得分:3)
不要创建一堆线程;使用ExecutorService,使用SingleThreadExecutor初始化它,并为您的用户(客户端类)提供他们可以调用的API,以便将作业提交给Executor。通过替换(或专门化)执行者,这为您提供了很多未来的灵活性。
以下是评论的第二次投票:请阅读Brian Goetz的“Java Concurrency In Practice” - 我不能高度推荐这一点。
在等待你的书到达时:
http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html http://tutorials.jenkov.com/java-util-concurrent/executorservice.html