Tag: multithreading

tomcat 6线程池用于异步处理

简短的问题: 在Tomcat 6应用程序中 – 如何运行(单独的)线程池? 运行线程池的最佳解决方案是什么? 长问题: 我这里有一个简单的需要; 轮询数据库中的某些数据,同时允许Web客户端等待答复(长轮询连接)。 当数据在数据库中可用时,我会向相关客户发送回复。 这么说,我不想深入研究任何框架( quartz scheduler可能?)。 因此,正如我总结的那样,我需要一个线程池来在后台完成工作。 因此,如果Thread是我即将使用的(实际上是Runnable ),哪个类可以组织它呢? 有没有ThreadPool解决方案? 有什么建议?

如果需要处理太多数据,我如何让ThreadPoolExecutor命令等待?

我从队列服务器获取数据,我需要处理它并发送确认。 像这样的东西: while (true) { queueserver.get.data ThreadPoolExecutor //send data to thread queueserver.acknowledgement 我不完全理解线程中发生了什么,但我认为这个程序获取数据,发送线程然后立即确认它。 因此,即使我有一个每个队列的限制只能有200个未确认的项目,它只会拉到它可以接收它的速度。 当我在单个服务器上编写程序时,这很好,但如果我使用多个工作程序,那么这就成了一个问题,因为线程队列中的项目数量不是它完成的工作的反映,而是它的速度有多快可以从队列服务器获取项目。 如果线程队列充满工作,有什么办法可以让程序等待吗?

在Java中并行线程中写入文件的最佳方法是什么?

我有一个执行大量计算的程序,并经常将它们报告给一个文件。 我知道频繁的写操作可能会使程序运行速度降低很多,所以为了避免它,我希望有一个专门用于写操作的第二个线程。 现在我正在用我写的这个课做(不耐烦可以跳到问题的最后): public class ParallelWriter implements Runnable { private File file; private BlockingQueue q; private int indentation; public ParallelWriter( File f ){ file = f; q = new LinkedBlockingQueue(); indentation = 0; } public ParallelWriter append( CharSequence str ){ try { CharSeqItem item = new CharSeqItem(); item.content = str; item.type = ItemType.CHARSEQ; q.put(item); return […]

为什么单个线程进程在多个处理器/内核上执行?

假设我运行一个简单的单线程进程,如下所示: public class SirCountALot { public static void main(String[] args) { int count = 0; while (true) { count++; } } } (这是Java,因为这是我所熟悉的,但我怀疑它并不重要) 我有一个i7处理器(4核,或8计数超线程),我正在运行Windows 7 64位,因此我启动了Sysinternals Process Explorer来查看CPU使用情况,正如预期的那样,我发现它使用了大约20%所有可用的CPU。 但是,当我切换每个CPU显示1个图形的选项时,我发现使用的是4个“核心”中的1个,CPU占用率遍布整个核心: 相反,我期望的是1核最大化,但这只发生在我将流程的亲和力设置为单核时。 为什么工作负载分散在不同的核心上? 不会将工作负载分散到多个核心,因为缓存还是会导致其他性能损失? 这是为了防止一个核心过热的简单原因吗? 还是有更深层次的原因? 编辑:我知道操作系统负责调度,但我想知道为什么它“烦恼”。 当然,从一个天真的角度来看,将(主要是*)单线程进程坚持到1核心是更简单,更有效的方法吗? *我说主要是单线程,因为这里有多个theads,但只有2个在做任何事情:

Java中的最终静态变量是否安全?

我已经阅读了很多,但没有找到明确的答案。 我有一个看起来像这样的课程: public class Foo() { private static final HashMap sharedData; private final HashMap myRefOfInnerHashMap; static { // time-consuming initialization of sharedData final HashMap innerMap = new HashMap; innerMap.put… innerMap.put… …a sharedData.put(someKey, java.util.Collections.unmodifiableMap(innerMap)); } public Foo(String key) { this.myRefOfInnerHashMap = sharedData.get(key); } public void doSomethingUseful() { // iterate over copy for (Map.Entry entry : this.myRefOfInnerHashMap.entrySet()) […]

Java执行程序:等待任务终止。

我需要提交一些任务,然后等待所有结果,直到所有结果都可用。 它们中的每一个都向Vector添加一个String (默认情况下是同步的)。 然后我需要为Vector中的每个结果启动一个新任务,但是只有当所有先前的任务都停止完成它们的工作时我才需要这样做。 我想使用Java Executor,特别是我尝试使用Executors.newFixedThreadPool(100)来使用固定数量的线程(我有一个可变数量的任务,可以是10或500)但我是执行器和我不知道如何等待任务终止。 这就像我的程序需要做的伪代码: ExecutorService e = Executors.newFixedThreadPool(100); while(true){ /*do something*/ for(…){ } for each String in result{ } } 我不能做e.shutdown,因为我有一段时间(真的)我需要重用executorService … 你能帮助我吗? 你能给我一个关于java执行器的指南/书吗?

理解java的本机线程和jvm

我知道jvm本身就是一个将java可执行文件的字节码转换为本机机器代码的应用程序,但是当使用本机线程时,我有一些我似乎无法回答的问题。 每个线程都创建自己的jvm实例来处理它们的特定执行吗? 如果没有那么jvm必须有一些方法来安排它接下来将处理哪个线程,如果这样,这不会使java的multithreading性质无用,因为一次只能运行一个线程?

从Java线程返回值

我有一个类似以下的Java线程: public class MyThread extends Thread { MyService service; String id; public MyThread(String id) { this.id = node; } public void run() { User user = service.getUser(id) } } 我有大约300个ID,每隔几秒钟 – 我启动线程来调用每个id。 例如。 for(String id: ids) { MyThread thread = new MyThread(id); thread.start(); } 现在,我想从每个线程收集结果,并对数据库进行批量插入,而不是每2秒进行300次数据库插入。 知道我怎么能做到这一点?

如何编写服务器/客户端video和音频流应用程序?

我必须创建一个客户端/服务器系统来流式传输video和音频。 这很简单。 喜欢youtube风格。 服务器应首先参加提供媒体列表的客户端,并等待每个客户端的选择以开始流式传输媒体。 直到创建一个套接字并显示一个简单的列表我就在它上面;)但我不知道我可以使用哪个类来传输。 这个例子基本上是youtube风格。 如何开始流式传输,客户端如何暂停再现,怎么能? 我知道如何流式传输文字,但video呢? 你知道任何教程页吗? 它与这个简单的服务器客户端示例有很大不同? import java.io.*; import java.io.*; import java.net.*; public class ThreadedEchoServer { public static void main(String[] args) { try { int i = 1; ServerSocket s = new ServerSocket(8189); while(true) { Runnable r = new ThreadedEchoHandler(incoming, i); Thread t = new Thread(r); t.start(); i++; } } catch […]

调用select()时,Java节点在使用选择器注册通道时阻塞。 该怎么办?

我有一个基本问题。 SelectableChannel的寄存器方法为何以及如何阻止调用。 让我提供一个场景。 我在类Register中创建了一个Selector对象,如下所示。 private static Selector selector = Selector.open(); 我在同一类(寄存器)中也有一个方法用选择器注册通道。 public static SelectionKey registerChannel(SelectableChannel channel, int ops) throws IOException { channel.configureBlocking(false); return channel.register(selector, ops); } 还有另一个名为Request的类,它具有从通道,进程和调用方法中读取数据以注册通道的方法。 selectonKey = Register.register(socketChannel, SelectionKey.OP_READ); 在这一点上,线程被阻塞,没有提供它正在等待的线索。 我已经确认选择器已打开。 请帮助我了解如何解决此问题。 我可以释放任何锁吗? 任何输入将不胜感激。 添加到我所描述的内容中。 进一步的测试显示,如果从同一个线程调用Register.register方法,它可以注册但在此之后如果其他一些线程试图调用该方法,则线程不会继续前进。