Tag: multithreading

为什么静态字段通常被视为线程安全?

我是一名.NET和Java开发人员,他对线程相对较新。 我想知道为什么静态字段,静态构造函数等通常被认为是“线程安全的”。 例如,在.NET中构造单例时,使其成为线程安全的一个技巧是使模式的某些组件成为静态。 如果我上述任何假设不正确,请告诉我。

使用单个线程进行异步处理

即使阅读http://krondo.com/?p=1209或异步调用是否始终创建/调用新线程? 我仍然对如何在固有的单线程系统上提供异步调用感到困惑。 到目前为止,我将解释我的理解并指出我的疑虑。 我读到的一个例子是描述提供异步处理请求的TCP服务器 – 用户可以调用方法,例如get(Callback c)并且稍后会调用回调。 现在,我的第一个问题 – 我们已经有两个系统,一个服务器和一个客户端。 这不是我的意思,因为事实上我们至少有两个线程 – 一个在服务器端,一个在客户端端。 我读的另一个例子是JavaScript,因为这是使用Node.js的单线程异步系统的最突出的例子。 我无法理解的是,也许用Java思考,是这样的:如果我执行下面的代码(对于不正确的,可能是恶劣的语法道歉): function foo(){ read_file(FIle location, Callback c) //asynchronous call, does not block //do many things more here, potentially for hours } 对read文件的调用执行(sth)并返回,允许我的其余函数执行。 既然只有一个线程,即执行我的函数的线程,那么同一个线程(执行我的东西的唯一一个线程)将如何从磁盘读取字节? 基本上,在我看来,我缺少一些基本机制,就像某种类型的循环调度程序,它本身就是单线程的,可能会将任务拆分为较小的或调用multithreading组件,这些组件会产生一个线程,读取文件。 提前感谢所有评论并指出我在路上的错误。 更新 :感谢所有回复。 帮助我解决这个问题的更多好消息来源是: http://www.html5rocks.com/en/tutorials/async/deferred/ http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/ http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless(.NET ) http://ejohn.org/blog/how-javascript-timers-work/ (计时器的内在函数) http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/

Java需要新线程的内存

我有一个大规模创建线程的应用程序。 结果我得到一个OutOfMemoryError 。 我的想法是等到有足够的可用空间来创建下一个Thread 。 但是因此我需要知道创建一个线程需要多少内存以及这个内存是否可用。 有没有办法获得线程需要的内存量? 如何确定此内存量是否可用? 我已经尝试过的: for (int i = 0; i < links.size(); i++) { while(Runtime.getRuntime().maxMemory() – Runtime.getRuntime().totalMemory() + Runtime.getRuntime().freeMemory() < MEMORY_THRESHOLD) { synchronized (lock) { lock.wait(10); } } Thread t = new Thread(new Task(links.get(i))); t.setDaemon(true); t.start(); } 但即使我使用100MB作为阈值,我也会得到一个OutOfMemoryError 。

同步不同步

synchronized似乎没有像我预期的那样工作。 它不应该使得括号内的代码相对于由同一对象synchronized的单独代码块而言是primefaces的吗? 我发现它在我的代码中根本没有同步。 private Object movementMutex_ = new Object(); // Thread public void run() { while (run_) { synchronized(movementMutex_) { if (timeToMove_) { Log.v(“meh”, “timeToMove_ was true, moving”); makeMove(); Log.v(“meh”, “Move Complete. Setting timeToMove_ to false”); timeToMove_ = false; Log.v(“meh”, “timeToMove_ is now false”); } } } } // Called by a different thread so […]

Java代理发现机器人

我写了一个类,ProxyFinder连接到随机ips并首先ping它们,如果它们响应,尝试通过公共代理端口创建一个http代理连接。 目前,它只是连接到随机ips。 这相对较快,每小时发现一些代理。 但是,我想以某种方式检查我之前是否已连接到ip。 首先我尝试将它们保存在一个列表中,但是使用了超过10GB的ram ..我在下面的代码中包含了一个方法,该方法使用RandomAccessFile将数据写入缓存,但搜索到的速度非常慢每个连接变大的整个文件。 我以尽可能小的格式存储数据,每个ip只需四个字节。 即使这是4 * 256 * 256 * 256 * 256字节.. = 16gb的原始ram ..或每次要测试另一个ip时搜索的16gb文件。 我还尝试创建一个单独的线程来生成ips,根据文件检查它们,然后将它们添加到探针线程可以从中拉出的队列中。 它无法跟上探测线程。 如何快速检查我是否已连接到IP,而不是非常慢或使用可笑的内存量? package net; import java.io.File; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; /** * * @author Colby */ public class ProxyFinder { /** * @param […]

如何在标准Java中实现Android消息处理程序模式?

我正在写一个通过蓝牙与PC通信的Android应用程序。 在正常操作期间,它会从电话向PC发送快速连续的短8字节数据包,通常大于100Hz。 在每个设备上,运行一个执行写入和读取的单独线程。 代码如下所示: /** * The Class ProcessConnectionThread. */ public class ConnectedThread extends Thread { /** The m connection. */ private StreamConnection mmConnection; InputStream mmInputStream; OutputStream mmOutputStream; private boolean mmCanceled = false; /** * Instantiates a new process connection thread. * * @param connection * the connection */ public ConnectedThread(StreamConnection connection) { mmConnection = […]

Thread.sleep和重新绘制

我有一个显示文本的面板。 我希望面板更改其文本,然后在其他任何事情发生之前暂停应用程序。 我正在使用Thread.sleep(1000)。 但是,出于某种原因,应用程序在调用Thread.sleep之前没有完成绘制面板(文本没有被更改)。 我也试过这个: board.invalidate(); board.setLeftMessage(“Not”); board.setRightMessage(“Here”); board.revalidate(); Date current = new Date(); long timeNow = current.getTime(); Date newDate = new Date(timeNow + 1000); while (current.before(newDate)) current = new Date(); 但也没有运气。 有人有建议吗? 非常感谢。

如何分离业务逻辑和电子邮件发送function?

我的java web应用程序中有一个要求,我需要在某些条件下发送电子邮件警报。 为此,我使用了javax mail api并发送电子邮件工作正常。 但问题是程序执行等待直到执行发送电子邮件的方法。 由于在不同的点上发送了数百封电子邮件……这会显着降低性能。 我正在使用弹簧,也使用了弹簧。 任何人都可以建议我如何分离我的业务逻辑和发送电子邮件function。 它应该像 – 发送电子邮件是我的建议,在调用xyz方法时执行 – 所以主要执行不应该等待建议完成其执行,而应该返回并执行进一步的业务逻辑,从而单独执行电子邮件发送。 这里创建新线程似乎是明显的选择。 但我认为可能有更好的方法,是吗? 谢谢。

如何在Swing中实现“进行中”动画?

我正在开发一个执行一些运行很长时间的函数的应用程序。 为了让用户知道正在进行处理,我需要一个标签,可以显示一些可以代表该标签的标签。 所以,我为这样的标签创建了一个小部件。 下面的程序运行find,我得到了我想要的输出。 import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** * This is an extension to a JLabel that can be used to display an ongoing progress. * @author Ankit Gupta */ public class ProgressLabel extends JLabel { /** * The prefix label to which periods […]

如何让多个Threads绘制到AWT组件上?

编辑:解决了,看下面我的解决方案。 首先,这是我的第一个问题,所以如果我犯了任何错误,请告诉我。 我正在尝试用Java编写Mandelbrot分形程序,用于培训目的。 我想要的所有function的理想选择是Fractalizer( http://www.fractalizer.de/en/ ),但就目前而言,我会对在屏幕上绘制Mandelbrot Set的程序感到满意(而不是例如,将其写入图像文件)。 当然,我希望程序快速,所以我认为我可以将计算分成多个线程来利用我的多核处理器; 例如,在四核系统上,图像将被分成2×2 = 4个图像,每个图像由单独的线程计算。 所有这些线程都会传递一个Graphics对象,并在计算像素时绘制像素。 我的第一次尝试是让线程在BufferedImage.getGraphics()上绘制,并且只要图像没有完成,paint()方法就会不断调用repaint(): g.drawImage(tempImg, 0, 0, null); if (waiterThread.isAlive()) { try { Thread.sleep(10); } catch (InterruptedException e) { // do nothing } repaint(10); } (waiterThread一个接一个地连接所有计算线程,所以只要waiterThread存活,至少有一个计算线程尚未完成。) 这有效,但由于经常重新绘制,会在canvas上造成难看的闪烁。 然后,通过一个小的测试程序,我发现Graphics.draw *任何*在paint方法返回之前立即在屏幕上绘制,所以我当前的方法如下: 一个GridLayout包含2×2的面板(在<4核系统上,1×1)MandelbrotCanvas对象 每个MandelbrotCanvas对象将在第一次paint()调用时初始化一个计算Thread,将其自己的Graphics对象传递给它(实际上,我使用的是一个自定义的GroupGraphics类,它将一个Graphics调用传递给多个图形,以“备份”将图像转换为BufferedImage.getGraphics(),但这并不重要),并启动计算线程。 面板将在其paint()方法中从每个MandelbrotCanvases中获取计算线程并加入()它们。 不幸的是,这只会产生黑屏。 仅在计算完成时,才会显示图像。 将多个线程绘制到一个组件上的正确方法是什么? 编辑: 我不知道的事情:只允许事件调度线程在AWT组件上绘制(粗略说出),这意味着上面的最后一种方法不可行 – 显然,它应该抛出exception,但我没有’得到一个。 我的解决方案是使用第一种方法 – 将图像绘制到BufferedImage上并将其绘制到Canvas上 – 唯一的修改是我重载update()方法以调用paint()方法而不清除绘制区域 : public […]