Tag: multithreading

在Java中什么是快速,等待通知或忙等待?

我知道使用busy-wait不是一个好的编程习惯,最好尽可能使用同步对象(wait-notify)。 但是我想知道一个人是否准备好牺牲cpu周期,然后忙着等待更快或等待通知? 我假设wait-notify将涉及对同步对象的内部锁定,并且信号可能来自内核以唤醒线程,使得这种方法比忙碌等待慢得多,其中人们可以直接检查条件直到它是满意。 只要满足此条件(例如,布尔值== true),线程就可以从繁忙的等待中退出。 根据我的理解,我感到很忙 – 等待应该更快。 如果我的论点是错误的,如果其他人能分享他们的想法并纠正我,我将不胜感激。

我可以使用FileChannel独立地从不同的线程中查找文件吗?

我创建了一个适用于FLV文件的Web应用程序。 此应用程序使用我创建的库来解析flv文件中的内容。 该库使用FileChannel来搜索文件。 我现在遇到一种奇怪的行为,因为我从不同的线程中寻找相同的flv文件。 假设Thread_1和Thread_2都在同时寻找movie.flv (我的问题在示例之后)。 Thread_1 // Thread_1 moves to position 200 to read something FileChannel chan1 = new FileInputStream(“movie.flv”).getFileChannel(); chan1.position(200); Thread_2 (在Thread_1之后执行) // Thread_2 moves to position 600 to read something else FileChannel chan2 = new FileInputStream(“movie.flv”).getFileChannel(); chan2.position(600); 最后Thread_1做了: ByteBuffer bb = ByteBuffer.allocate(40); chan1.read(bb); Thread_1是从位置200还是从位置600读取40个字节? 更准确地说, chan1和chan2是否独立(=可以独立寻找)通道? 从文档中我读到FileChannel是唯一的 ,所以我的赌注(不幸的是)在示例中Thread_1将从位置600读取: 在这种情况下,你能建议一种不同的方法来独立于不同的线程寻找文件吗? 谢谢!

如何在ForkJoinPool中阻止队列?

我需要在其队列已满时阻止ForkJoinPool上的线程。 这可以在标准的ThreadPoolExecutor中完成,例如: private static ExecutorService newFixedThreadPoolWithQueueSize(int nThreads, int queueSize) { return new ThreadPoolExecutor(nThreads, nThreads, 5000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(queueSize, true), new ThreadPoolExecutor.CallerRunsPolicy()); } 我知道,ForkJoinPool中有一些Dequeue,但是我无法通过它访问它。 更新:请参阅下面的答案。

具有多个线程的’N’项的进程列表

我有N项目的List ,我想在固定数量的threads之间按顺序划分此List 。 顺序我的意思是,我想传递1 to N/4到第一个thread , N/4 + 1 to N/2到第二个线程和N/2+1 to N到第三个thread ,现在一旦所有threads完成了他们的工作,我想通知主thread发送一些消息,说明所有处理都已完成。 到目前为止我所做的是我已经实现了ExecutorService 我做了这样的事 ExecutorService threadPool = Executors.newFixedThreadPool(Number_of_threads); //List of items List List itemList = getList(); for (int i = 0 i < Number_of_threads ;i++ ) { //how to divide list here sequentially and pass it to some processor while will process […]

while循环和线程的无限循环问题

使用一个基本的例子来说明我的问题,我有两个几乎相同的代码位。 此代码使while循环无限运行。 private boolean loadAsset() { new Thread(new Runnable() { @Override public void run() { // Do something loaded = true; } }).start(); while (!loaded) { // System.out.println(“Not Loaded”); } System.out.println(“Loaded”); return false; } 但是这个代码(即在while循环中执行某些操作)会导致已成功计算loaded变量,并允许while循环中断并完成方法。 private boolean loadAsset() { new Thread(new Runnable() { @Override public void run() { // Do something loaded = true; } […]

使用Java RealTime的生产者 – 消费者体系结构

我正在使用Java Realtime(Sun JRTS 2.2)设计交易系统,并且想要了解最佳实践的几个问题,因为我害怕发明轮子并且非常确定我的任务已经解决了。 所以我有线程不断读取套接字,解析字节和提取消息(二进制协议)。 之后,我应该向算法发送消息,实际上做了一些计算并决定交易与否。 所以我认为我应该设计这个系统的方法是将它分成两部分。 生产者(定期(?)实时线程从套接字中提取字节,解析它)和消费者(实时线程(周期性/偶发性?)从生产者中提取消息,与它们一起操作等)。 那么第一个问题是如何在这两个线程(生产者/消费者)之间设计高性能通信? 此外,我很想听听有关设计此类系统,建议等的现有经验的评论。 感谢您的帮助!

需要帮助java web app设计来执行后台任务

我有一个安装在台式PC上的本地Web应用程序,它需要通过Web服务定期与远程服务器同步。 我有一个“事务”表,用于存储已在本地处理并需要发送到远程服务器的事务,此表还包含从远程服务器检索的事务(已远程处理)并需要执行本地(它们已使用Web服务调用检索)…事务按时间顺序执行,以确保以正确的顺序处理它们。 交易类型的一个例子是来自商店的项目的“贷款”和“退货”,例如video租赁商店。 例如,某些东西可能已在本地借出并远程返回,反之亦然,或任何一系列的贷款/退货事件。 还有从远程服务器检索的其他信息以更新本地记录。 当用户在本地执行任务时,我会实时更新本地数据库,并将事务添加到表中,以便与远程服务器进行后台处理。 处理后台任务的最佳方法是什么。 我尝试使用在HTTPSessionListener中创建的Thread,并在删除会话时使用interrupt(),但我不认为这是最安全的方法。 我也尝试使用会话属性作为锁定机制,但这也不是最好的方法。 我也想知道你怎么知道一个线程何时完成它的运行,以避免同时运行另一个线程。 或者线程是否在完成之前已经丢弃。 我已经提出了另一个建议,使用Quartz调度程序,我还没有详细阅读这种方法。 我将在实践中购买Java Concurrency的副本,但在我遇到它之前,我想要一些关于最佳方法的想法的帮助。 顺便说一下,我没有使用Web应用程序框架。 谢谢。

Android:暂停/恢复计时器或线程

我已经检查了所有关于如何暂停/恢复计时器的SO答案,但找不到解决方案。 我创建了一个Timer任务,它计算员工的工作时间并将其放在TextView中显示。 代码如下: Timer T = new Timer(); T.scheduleAtFixedRate(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { String workingTime = “Your effort is ” + format.format(Double.valueOf(hr)) + “:” + format.format(Double.valueOf(min)) + “:” + format.format(Double.valueOf(sec)) + ” till now for the day”; storeEffort.setText(workingTime); sec++; if (sec > 59) { […]

在Java中:如何让线程监视另一个线程?

对不起,问题很简单。 我是初学者。 我必须创建线程来计算某些东西,而第一个线程工作,另一个必须测量第一个线程是否在指定时间内计算函数。 如果没有,它必须抛出exception。 否则它会返回答案。

用于java图形的multithreading

我有一个java应用程序,它可以传输原始数据并相应地绘制实时图。 这是通过调用我编写的使用Graphics对象的类的方法来处理的。 我在重写的paintComponent方法中实现了算法,以生成最新数据中的所有图。 我在我的类中有其他方法来更新paintComponent方法中使用的变量来绘制图形。 在我的主类中,我定期在计时器事件处理程序中更新我的图形。 在事件处理程序中,我从我的图形类中调用更新某些变量的方法,进行一些计算,然后调用repaint()(这显然是调用paintComponent方法的正确方法)。 我的问题是,我在paintComponent方法中使用的算法可能需要(相对)长的时间来完成,具体取决于我的图的数量和分辨率。 (我还没有遇到这个问题,但我现在正试图解决它)。 当然我不希望所有这些图形占用我的应用程序的所有处理时间,所以我想知道是否可以在单独的线程中执行“paintComponent”。 如果我在main中创建一个子类来运行一个单独的线程并简单地调用我描述的图形方法会发生什么? 会自动使所有这些方法(包括paintComponent)在新线程中执行吗? 或者我是否必须修改我的图表类本身才能使用? 理想情况下,我想避免修改我的图表类,因为我已经将它设计为在NetBeans GUI构建器中作为JPanel工作,我想避免破坏该function。