我有一个单线程生成器,它创建一些任务对象,然后将其添加到ArrayBlockingQueue
(具有固定大小).
我也开始了一个多线程的消费者.这是一个固定的线程池(Executors.newFixedThreadPool(threadCount);
).然后我向这个threadPool提交了一些ConsumerWorker入口,每个ConsumerWorker都对上面提到的ArrayBlockingQueue实例进行了引用.
每个这样的工作人员都会take()
在队列中执行并处理任务.
我的问题是,当没有更多的工作要做时,让工人知道的最佳方法是什么.换句话说,如何告诉Workers,生产者已经完成了对队列的添加,从这一点开始,每个工作人员在看到Queue为空时应该停止.
我现在得到的是一个设置,我的Producer初始化了一个回调,当他完成它的工作(向队列中添加东西)时会触发回调.我还保留了我创建并提交给ThreadPool的所有ConsumerWorkers的列表.当Producer Callback告诉我生产者已完成时,我可以告诉每个工人.此时,他们应该只是继续检查队列是否为空,当它变为空时它们应该停止,从而允许我优雅地关闭ExecutorService线程池.就是这样的
public class ConsumerWorker implements Runnable{
private BlockingQueue<Produced> inputQueue;
private volatile boolean isRunning = true;
public ConsumerWorker(BlockingQueue<Produced> inputQueue) {
this.inputQueue = inputQueue;
}
@Override
public void run() {
//worker loop keeps taking en element from the queue as long as the producer is still running or as
//long as the queue is not empty:
while(isRunning || !inputQueue.isEmpty()) {
System.out.println("Consumer "+Thread.currentThread().getName()+" START");
try {
Object queueElement = inputQueue.take();
//process queueElement …
Run Code Online (Sandbox Code Playgroud) 我有一个精简测试项目,其中包含一个Servlet版本3.0,使用如下注释声明:
@WebServlet("/test")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = -3010230838088656008L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.getWriter().write("Test");
response.getWriter().flush();
response.getWriter().close();
}
}
Run Code Online (Sandbox Code Playgroud)
我也有一个像这样的web.xml文件:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>g1.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/testWebXml</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我尝试使用嵌入式Tomcat 7进行JUnit测试.当我启动嵌入式Tomcat时,我只能通过web.xml(/ testWebXml)中声明的url-pattern访问servlet.如果我尝试通过注释(/ test)声明的url-pattern访问它,则找不到404页面.
这是我测试的代码:
String webappDirLocation = "src/main/webapp/";
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
tomcat.addWebapp("/jerseyTest", new File(webappDirLocation).getAbsolutePath());
tomcat.start();
tomcat.getServer().await();
Run Code Online (Sandbox Code Playgroud)
为了确保我正确设置我的项目,我还安装了一个实际的Tomcat 7并部署了战争.这一次,web.xml声明的url和我的servlet的注释url工作正常.
所以我的问题是:有没有人知道如何让嵌入式Tomcat 7考虑到我的Servlet 3.0注释?
我还应该声明它是一个Maven项目,并且pom.xml包含以下依赖项:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>7.0.29</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId> …
Run Code Online (Sandbox Code Playgroud) 在思考了一个通用的方法来提出这个问题(并且没有找到一个)后,我只想问它是一个具体的例子:
假设我有一台具有1 Gb内存的Linux机器,它可以分配给进程(物理和交换总数为1 Gb).
我在计算机上安装了标准的Oracle Hotspot JVM版本7.如果在给定时刻,有足够的程序运行,只有400 Mb的1 Gb是空闲的,并且我在那时使用以下JVM标志启动Java程序:
java -Xms256m -Xmx512m -jar myJar.jar
Run Code Online (Sandbox Code Playgroud)
发生了什么?:
A. JVM是否无法立即启动,因为它会尝试分配所有512 Mb内存并失败(由于目前没有足够的可用内存)?
如果JVM启动:
如果在某些时候正在运行的Java进程需要超过400 Mb的内存(并且除了当前的Java进程已经使用的内存之外,仍然只有400 Mb的内存可用),会发生什么:
B. Java进程是否会因OutOfMemroyError而失败?
C.它会因某些其他(标准)错误而失败吗?
D.是不确定的行为?
从我所看到的,如果我想做一个非opengl游戏循环我可以做的是有一个游戏线程,在循环期间将更新游戏状态(或游戏物理),并通过锁定a Canvas
来更新图形(正常)SurfaceView
,通过Canvas.drawXXX(...)方法进行绘图,然后将其解锁,此时图形将更新为循环.
使用GLSurfaceView
和时,我真的不知道如何做到这一点Renderer
.根据我的理解,我不能再像我在常规表面那样按照手工制作的gameThread绘制Canvas
,因为现在有一个渲染线程会调用Renderer.onDrawFrame()
(在我实现的渲染器类中,我传递给GLSurfaceView).
那么我的问题是,用GLSurfaceView和Renderer制作游戏循环的好方法是什么?我是否仍然应该制作单独的游戏线程,但只处理其中的游戏状态(物理)更新,然后在我的Renderer.onDrawFrame()实现中使用该游戏状态来实际绘制基于当前状态的图形?我应该只使用Rendere的线程来进行状态更新吗?
我有以下C代码:
//declared at the beginning of the CAStar.c file:
int TERRAIN_PASSABLE = 1;
int TERRAIN_IMPASSABLE = 0;
int TERRAIN_SOME_WHAT_PASSABLE = 2;
Run Code Online (Sandbox Code Playgroud)
我注意到,对于这些变量中的任何一个,如果它们具有非零值,则"nm"命令将它们报告为类型"D"(初始化):
_TERRAIN_PASSABLE |00000008| D |
_TERRAIN_SOME_WHAT_PASSABLE|00000004| D |
Run Code Online (Sandbox Code Playgroud)
但是,初始化为0的那些报告为"B"(未初始化):
_TERRAIN_IMPASSABLE |00000000| B |
Run Code Online (Sandbox Code Playgroud)
为什么"初始化为0"和"用0以外的其他东西初始化"之间的区别?
免责声明:我真的相信这不是类似问题的重复。我读过这些,他们(大部分)推荐使用堆或优先级队列。我的问题更多是“我不明白在这种情况下它们将如何工作”。
简而言之:
我指的是典型的 A*(A 星)寻路算法,如(例如)在 Wikipedia 上所述:
https://en.wikipedia.org/wiki/A*_search_algorithm
更具体地说,我想知道什么是最好的数据结构(可以是单个众所周知的数据结构,也可以是这些结构的组合),这样您就不会在算法的任何操作上获得 O(n) 性能需要在 open list 上做。
据我了解(主要来自维基百科的文章),需要对open list进行的操作如下:
此列表中的元素必须是具有以下属性的 Node 实例:
鉴于这些,操作是:
就我所见,对打开列表使用堆或优先级队列的问题是:
此外,如果我们制作自定义数据结构,例如使用 Hashtable(以位置为键)和优先队列的数据结构,我们仍然会有一些操作需要对其中任何一个进行次优处理:为了保持它们同步(两者都应该有相同的节点),对于给定的操作,该操作在其中一个数据结构上总是次优的:按位置添加或删除节点在 Hashtable 上会很快,但在 Priority Queue 上会很慢。删除具有最低 F 分数的节点在 Priority Queue 上会很快,但在 Hashtable 上会很慢。
我所做的是为使用它们的位置作为键的节点创建一个自定义 Hashtable,它还跟踪具有最低 F 分数的当前节点。添加新节点时,它会检查其 F 分数是否低于当前存储的最低 F 分数节点,如果是,则替换它。当您想要删除节点(无论是按位置还是最低的 F 得分为 1)时,此数据结构的问题就出现了。在这种情况下,为了更新保存当前最低 F 分数节点的字段,我需要遍历所有剩余的节点,以找到现在哪个节点的 F 分数最低。 …
OpenGL文档说应该在GL_MODELVIEW矩阵上完成gluLookAt()调用:
http://www.opengl.org/resources/faq/technical/viewing.htm
事实上,文档链接到一篇文章,该文章说在GL_PROJECTION矩阵上使用gluLookAt()极其糟糕:
另一方面,有许多教程和示例,其中gluLookAt()实际上是在GL_PROJECTION矩阵上调用的.同时,虽然上面提到的文章确实说不在GL_PROJECTION矩阵上使用它,但是在大多数这样的用法中,这样做没有明显的问题.
那么我的问题是:在现实生活中使用gluLookAt()的最佳方法是什么?在GL_PROJECTION矩阵上使用它真的不是很难吗?
我有一个非常基本的问题:在GAE中,如果我第一次从数据库中检索数据时使用memcache存储一些数据,那么如果数据在缓存中保留了2天,那么所有应用程序的实例都会得到"看到"并从缓存中检索它?或者每个应用程序实例的缓存是否分开?
我问这个因为我已经看到了,因为GAE为应用程序需要的每个新实例生成单独的VM进程(而不是线程)的方式,以前在所有实例(在线程模型中)一致的东西现在是每个实例(进程)分段:就像servlet应用程序上下文一样,它不会在同一个应用程序的所有实例中传播.
那么,memcache是否会在同一个应用程序的多个实例中保持一致,或者它是否创建了每个实例/进程的缓存数据集?
我有以下问题:我有非常大的XML文件(如300+ Megs),我需要解析它们以便将一些值添加到数据库中.这些文件的结构也非常复杂.我想使用Stax Parser,因为它提供了一次拉解析(并因此处理)XML文件的一部分的可能性,因此不会将整个内容加载到内存中,但另一方面获取值Stax(至少在这些XML文件上)很麻烦,我需要编写大量代码.从后一种观点来看,如果我可以将XML文件编组为Java对象(就像JAX-B那样),那将对我有所帮助,但是这会将整个文件加上大量的Object实例同时加载到内存中.
我的问题是,有没有办法按顺序解析(或只是部分解析)文件,然后只将那些部分编组到Java对象中,这样我就可以轻松处理它们而不会让内存陷入困境?
虽然我确实掌握了OpenGL的基本知识,但我只是从libgdx开始.
我的问题是:为什么,拥有完全相同的代码,但只从OrthographicCamera切换到PerspectiveCamera有不再显示我的任何SpriteBatches的效果?
这是我使用的代码:
create()方法:
public void create() {
textureMesh = new Texture(Gdx.files.internal("data/texMeshTest.png"));
textureSpriteBatch = new Texture(Gdx.files.internal("data/texSpriteBatchTest.png"));
squareMesh = new Mesh(true, 4, 4,
new VertexAttribute(Usage.Position, 3, "a_position")
,new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords")
);
squareMesh.setVertices(new float[] {
squareXInitial, squareYInitial, squareZInitial, 0,1, //lower left
squareXInitial+squareSize, squareYInitial, squareZInitial, 1,1, //lower right
squareXInitial, squareYInitial+squareSize, squareZInitial, 0,0, //upper left
squareXInitial+squareSize, squareYInitial+squareSize, squareZInitial,1,0}); //upper right
squareMesh.setIndices(new short[] { 0, 1, 2, 3});
spriteBatch = new SpriteBatch();
}
Run Code Online (Sandbox Code Playgroud)
和render()方法:
public void render() {
GLCommon gl = Gdx.gl;
camera.update();
camera.apply(Gdx.gl10); …
Run Code Online (Sandbox Code Playgroud)