Tag: 阻塞

Java线程不会在I / O操作上暂停

我的印象是,在Java中,线程会暂停并让其他线程有机会在阻塞I / O操作(如Socket.read()或DataGramsocket.receive())期间做一些工作。 出于某些原因,在我的multithreading网络应用程序中,对receive()的调用导致我所有其他线程都饿死(调用receive()的线程正在成为一个大老板,永远不会放弃控制,从而永远阻止!) 为什么会这样? 我曾经拥有相同的应用程序,但它不是UDP而是基于TCP。 Socket.read()总是暂停线程并允许其他人工作一段时间,如果它被阻塞太久了。 – 额外信息 – 我的自定义线程的TCP版本是这个代码: http : //www.dwgold.com/code/proxy/proxyThread.java.txt 我的新代码(UDP版本)几乎相同,但修改了一点使用UDP方法和样式。 然后我创建了其中两个线程,并在两个线程上调用start。 第一个线程总是阻塞,永远不会让另一个在UDP版本中工作。

Tomcat – Servlet响应阻塞 – 刷新问题

我正在使用Tomcat 6.0.36和JRE 1.5.0,我正在开发Windows 7上的开发工作。 作为我正在做的一些工作的概念certificate,从Java代码我是HTTP通过套接字将一些XML发布到servlet。 然后servlet回传xml。 在我的第一个实现中,我将两端的输入流交给XML文档工厂,以提取通过线路发送的xml。 这在servlet中顺利运行但在客户端失败了。 事实certificate它在客户端失败了,因为响应的读取阻塞了文档工厂超时并在整个响应到来之前抛出exception。 (文档工厂的行为现在没有实际意义,因为正如我在下面描述的那样,我在不使用文档工厂的情况下遇到了相同的阻塞问题。) 为了尝试解决这个阻塞问题,我提出了一个更简单的客户端代码版本和servlet。 在这个更简单的版本中,我从等式中删除了文档构建器。 双方的代码现在只是从各自的输入流中读取文本。 不幸的是,我仍然对响应有这个阻塞问题,正如我在下面描述的那样,它只是通过简单地调用response.flushBuffer()来解决。 谷歌搜索只搜索了我能找到的一个相关主题( Tomcat没有刷新响应缓冲区 ),但这不是完全相同的问题。 我已经包含了我的代码并解释了下面的确切问题。 这是我的servlet代码(请记住,这是一个简单的概念validation代码,而不是生产代码), import java.io.InputStreamReader; import java.io.LineNumberReader; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public final class EchoXmlServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { System.out.println(“EchoXmlServlet loaded.”); } public void doGet(HttpServletRequest request, HttpServletResponse […]

如何在Java 7中可移植地获取文件存储的块大小?

我查看了java.nio.file.attribute.Attributes和java.nio.file.FileStore ,但找不到发现磁盘文件块大小的方法。

为什么FileInputStream read()没有阻塞?

我有一个Writer程序,它将一行文本写入文件,然后等待用户在写入另一行之前返回,然后退出。 只有在那之后文件才关闭。 代码: public class Writer { Writer() { } public static String[] strings = { “Hello World”, “Goodbye World” }; public static void main(String[] args) throws java.io.IOException { java.io.FileOutputStream pw = new java.io.FileOutputStream(“myfile.txt”); for(String s : strings) { pw.write(s.getBytes()); System.in.read(); } pw.close(); } } 首先开始: java作家 然后我还有一个读者程序,只要文件的写入尚未完成(即尚未调用pw.close()),应该(我预期)阻止。 代码: public class ReaderFIS extends Object { […]

Java中的OutputStream是阻塞的吗? (sockets)

我目前正在为一个项目编写天真的网络代码,并且一位伙伴暗示我有可能当我以一种迭代的方式从服务器向所有客户端发送信息包时,当其中一个客户端没有正确响应时,我可能会遇到严重的延迟。 他因拖钓而闻名,所以当我实现一个现在负责将数据发送到客户端的辅助线程时,我有点怀疑,它有一个队列,服务器只是将数据包添加到那个然后被线程读取以发送数据。 在考虑它之后我现在的问题是天气与否,Java Socket的OutputStream实际上将他想要发送的东西排队,因此事先不需要队列。 只有当客户端没有收到来自客户端的已收到发送对象的响应时,才会出现发生严重问题的可能性。 谢谢。

使用Blocking IO进行multithreading会破坏Java中的文件

目的: –使用Java中的Blocking IO构建multithreading应用程序以下载文件。 请不要建议我使用Non-Blocking IO ,我被告知要使用这个。 问题: –我的代码在下载托管在服务器上的文件的客户端计算机上正常工作。 但是,问题是我的服务器使用多个线程播种文件。 在所有情况下,收到的文件都是精确的长度,但文件显示已损坏。 就像,当我下载PDF文件时,文件页面被写入到最后一半(意味着所有页面都填充了原始文件的部分内容)。 当我下载一首歌时,它会在整个过程中爆发并播放到那些噪音位。 问题1: –如何保持完美平滑的下载,以便文件正常播放/打开/读取? 我应该在这里解决因multithreading引起的问题。 我的代码: – 服务器multithreading代码:::: import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class FileServer extends UnicastRemoteObject implements FileServerInitialise{ private String file=””; public FileServer() throws RemoteException{ super(); } public void setFile(String f){ file=f; //System.out.println(“Length in setFile = […]

调用者阻塞,直到getFoo()准备好了值?

我有一个Java Thread ,它暴露了其他线程想要访问的属性: class MyThread extends Thread { private Foo foo; … Foo getFoo() { return foo; } … public void run() { … foo = makeTheFoo(); … } } 问题是从运行到foo可用需要很短的时间。 调用者可以在此之前调用getFoo()并获取null 。 我宁愿他们只是阻塞,等待,并在初始化发生后获取值。 ( foo之后永远不会改变。)在它准备好之前它将是几毫秒,所以我对这种方法很满意。 现在,我可以通过wait()和notifyAll()实现这一点,并且有95%的可能性我会做得对。 但我想知道你们都会怎么做; 在java.util.concurrent有一个原语可以做到这一点,我错过了吗? 或者,你会如何构建它? 是的,让foo变得不稳定。 是的,在内部锁定Object上同步并将检查放入while循环,直到它不为null 。 我错过了什么吗?

Java中golang通道的等价物

我有一个要求,我需要从一组阻塞队列中读取。 阻塞队列由我正在使用的库创建。 我的代码必须从队列中读取。 我不想为每个阻塞队列创建一个读者线程。 相反,我想使用单个线程(或者可能最多使用2/3线程)轮询它们的数据可用性。 由于某些阻塞队列可能长时间没有数据,而其中一些阻塞队列可能会获得数据突发。 轮询具有较小超时的队列将起作用,但这根本不是有效的,因为它仍然需要在所有队列上保持循环,即使其中一些队列长时间没有数据。 基本上,我正在寻找阻塞队列的select / epoll(用于套接字)类型的机制。 任何线索都非常感谢。 尽管如此,在Go中这样做很容易。 下面的代码模拟了与channel和goroutines相同的内容: package main import “fmt” import “time” import “math/rand” func sendMessage(sc chan string) { var i int for { i = rand.Intn(10) for ; i >= 0 ; i– { sc = 0; i– { time.Sleep(20 * time.Millisecond) c <- rand.Intn(65534) } i […]

Java阻塞问题:为什么JVM会在许多不同的类/方法中阻塞线程?

更新:这看起来像一个内存问题。 一个3.8 Gb的Hprof文件表明当发生“阻塞”时,JVM正在转储它的堆。 我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了该实例。 我相信他们在堆转储完成之前关闭了网站。 日志没有错误/exception/问题证据 – 可能是因为JVM在生成错误消息之前被杀死了。 原始问题我们有一个最近的情况,应用程序出现 – 最终用户 – 挂起。 我们在应用程序重启之前得到了一个堆栈跟踪,我发现了一些令人惊讶的结果:527个线程,463个线程状态为BLOCKED。 在过去过去被阻塞的线程通常有这个问题:1)一些明显的瓶颈:例如一些数据库记录锁定或文件系统锁定问题导致其他线程等待。 2)所有被阻塞的线程将阻塞相同的类/方法(例如jdbc或文件系统clases) 不寻常的数据在这种情况下,除了应用程序类(包括jdbc和lucene调用)之外,我还看到了各种类/方法被阻止,包括jvm内部类,jboss类,log4j等 问题是什么会导致JVM阻止log4j.Hierarchy.getLogger,java.lang.reflect.Constructor.newInstance? 显然有些资源“稀缺”,但哪些资源? 谢谢 将 堆栈跟踪摘录 http-0.0.0.0-80-417″ daemon prio=6 tid=0x000000000f6f1800 nid=0x1a00 waiting for monitor entry [0x000000002dd5d000] java.lang.Thread.State: BLOCKED (on object monitor) at sun.reflect.GeneratedConstructorAccessor68.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at org.jboss.ejb.Container.createBeanClassInstance(Container.java:630) http-0.0.0.0-80-451″ daemon prio=6 tid=0x000000000f184800 nid=0x14d4 […]

Java中的并发和阻塞队列

我有一个线程将事件推送到第二个线程的传入队列的经典问题。 只有这一次,我对表现很感兴趣。 我想要实现的是: 我希望并发访问队列,生产者推送,接收器弹出。 当队列为空时,我希望使用者阻塞队列,等待生产者。 我的第一个想法是使用LinkedBlockingQueue ,但我很快意识到它不是并发的,性能受到了影响。 另一方面,我现在使用ConcurrentLinkedQueue ,但我仍然在每个发布上支付wait() / notify()的成本。 由于消费者在找到空队列时没有阻塞,因此我必须在锁上进行同步和wait() 。 另一方面,生产者必须获得该锁定并在每个出版物上notify() 。 总体结果是我在每个出版物中支付sycnhronized (lock) {lock.notify()}的成本,即使不需要也是如此。 我想这里需要的是一个阻塞和并发的队列。 我想象一个push()操作在ConcurrentLinkedQueue工作,当push元素是列表中的第一个元素时,对象提供额外的notify() 。 我认为这样的检查已经存在于ConcurrentLinkedQueue ,因为推送需要连接下一个元素。 因此,这比每次在外部锁上同步要快得多。 是这样的/合理的吗?