Tag: multithreading

消息传递到Java J2ME中的asynchronus工作线程

我正在研究J2ME蓝牙应用程序,其中一个类搜索其他蓝牙设备。 它在另一个线程中执行此操作,因此GUI不会冻结。 我遇到的问题是如何将消息传递给线程。 我可以要求它搜索或取消搜索,它可以告诉GUI它找到了其他一些设备。 目前我使用通知和等待,但这似乎是一个黑客。 我真正想要的是用参数调用notify的一些方法,例如我想要它做什么。 有没有办法做到这一点?

什么是Java中的Thread的LifeCycle?

在java中我们创建一个线程对象 Thread t1 = new Thread(Runnable object); t1.start(); 线程t1的生命周期的不同阶段和执行run()之后的状态是t1 ?

ArrayBlockingQueue:并发put和take

为什么没有使用LinkedBlockingQueue的方式实现ABQ。 我们可以使用AtomicInteger来保持ABQ中的跟踪计数,也与LBQ一样。 我们也可以使用Two Locks for ABQ。 我偶然发现了关于SO的类似问题。 ArrayBlockingQueue使用单个锁进行插入和删除,但LinkedBlockingQueue使用2个单独的锁 但我无法理解这个问题的答案。 我需要帮助来理解如果我们使用两个锁实现ABQ会出现的问题。 如果有人可以举一个可能失败的竞争条件的例子,那将是非常好的。 这个问题可以标记为重复,但我真的在寻找更具描述性的答案。 那将是一个很大的帮助。 我在这里贴了一个代码http://pastebin.com/ZD1uFy7S 。 任何人都可以显示粘贴的代码中是否存在可能的竞争条件。

在java问题中使用JLayer在线程中只播放一个mp3文件

我正在使用带有GUI的Java编写的音频播放器。 为了播放mp3文件,我从javazoom中选择了JLayer库,因为我看到它非常受欢迎并且使用过。 我制作了GUI,设法播放播放列表中选定的mp3文件。 我的问题是,如果我在播放按钮或播放列表中的文件上多次按下它会开始播放歌曲多次,因为我按它并且我想在同一个线程中播放它; 如果我再次按下播放按钮,我想再次播放,而不是在当前播放时播放同一首歌。 这是播放mp3文件的代码: public class Playing implements Runnable{ private Player mp3Player; private Thread playerThread; public void createPlayer(FileInputStream file) throws JavaLayerException{ mp3Player = new Player(file); playerThread = new Thread(this); playerThread.start(); } @Override public void run(){ try { mp3Player.play(); } catch (JavaLayerException ex) { Logger.getLogger(Playing.class.getName()).log(Level.SEVERE, null, ex); } } 这是我播放按钮的方法: public void createPlayButton(){ play […]

带处理程序的顺序countdowntimer不会正确更新textView

我试图建立某种顺序倒计时。 意思是,我建立了一个“练习”队列,每个练习都包含一个特定的持续时间,即倒计时时间。 在自定义的Countdown类中,我将这些练习从队列中弹出并将持续时间用作倒计时。 我希望这些倒计时一个接一个地运行。 为此,我根据抽象类CountDownTimer的代码基础构建了一个Countdown类。 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Locale; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.widget.Button; import android.widget.TextView; public class ExerciseMeCountDownTimer { private static final int MSG_COUNTDOWN = 100; private static final int MSG_FINISH = 99; private ArrayDeque eq; private long mMillisInFuture; private int mCountdownInterval; private String name; private long […]

我该如何处理Java中的multithreading?

我正在研究与Java相关的实际场景;套接字程序。 现有系统和预期系统如下。 现有系统 – 系统检查是否满足某个条件。 如果是这样它将创建一些要发送的消息并将其放入队列中。 队列处理器是一个单独的线程。 它会定期检查队列中是否存在项目。 如果找到任何项目(消息),它只是将消息发送到远程主机(硬编码)并从队列中删除该项目。 预期的系统 – 就是这样的。 在满足特定条件时创建消息,但在每种情况下接收者都不相同。 所以有很多方法。 将消息放入同一队列但使用其接收者ID。 在这种情况下,第二个线程可以识别接收器,以便可以将消息发送到该接收器。 有多个线程。 在这种情况下,当满足条件并且接收器处于“新”状态时,它会创建一个新队列并将消息放入该队列。 并且新线程初始化以处理该队列。 如果下一个消息被定向到同一个接收者,它应该放在同一个队列中,如果不是新队列,则应该创建该线程。 现在我想实现第二个,有点卡住了。 我该怎么做? 骨架就足够了,您不必担心如何创建队列等… 🙂 更新:我也认为方法1是最好的方法。 我读了一些关于线程的文章并做出了这个决定。 但是,了解如何实施方法2也是非常值得的。

正确实现生产者 – 消费者场景和“优雅”终止线程池

我正在开发我的第一个multithreading项目,因此有一些我不确定的事情。 关于我的设置的详细信息是在上一个问题上 ,简而言之:我有一个由Executors.newFixedThreadPool(N)实现的线程池。 一个线程被赋予一个动作,该动作对本地和远程资源执行一系列查询,并迭代地填充ArrayBlockingQueue ,而其余​​线程调用队列上的take()方法并处理队列中的对象。 尽管小型和监督测试似乎运行正常,但我不确定如何处理特殊情况,例如开头(队列还没有项目),结束(队列清空)以及任何最终的InterruptedExceptions 。 我在这里做了一些阅读,然后让我读到 Goetz和Kabutz的两篇非常好的文章。 共识似乎是不应忽视这些例外。 但是我不确定提供的示例是如何与我的情况相关的,我没有在我的代码中的任何地方调用thread.interrupt() …说到这,我不确定我是否应该这样做… 总结一下,鉴于下面的代码,我如何最好地处理特殊情况,例如终止条件和InterrruptedExceptions? 希望问题有意义,否则我会尽力进一步描述。 提前致谢, 编辑:我已经在实施了一段时间了,我遇到了一个新的打嗝,所以我想我会更新情况。 我遇到了遇到ConcurrentModificationException的不幸,这很可能是由于线程池的不完全关闭/终止造成的。 一旦我发现我可以使用isTerminated()我试过,然后由于一个不同步的wait()我得到一个IllegalMonitorStateException 。 代码的当前状态如下: 我已经听过@ Jonathan的回答中的一些建议,但我不认为他的建议与我需要/想要的一样。 背景故事与我上面提到的相同,相关的代码如下: 持有/管理池的类,以及提交runnables: public void serve() { try { this.started = true; pool.execute(new QueryingAction(pcqs)); for(;;){ PathwayImpl p = bq.take(); if (p.getId().equals(“0”)){ System.out.println(“–DEBUG: Termination criteria found, shutdown initiated..”); pool.shutdown(); // give 3 minutes per item […]

在google appengine后端只运行一个后台线程

正如在文档中提到的,我在后端运行一个后台线程,其中一个实例是无限的,用于一些连续的后台处理。 import com.google.appengine.api.ThreadManager; import java.util.concurrent.AtomicLong; AtomicLong counter = new AtomicLong(); Thread thread = ThreadManager.createBackgroundThread(new Runnable() { public void run() { try { while (true) { counter.doStuff() Thread.sleep(10); } } catch (InterruptedException ex) { throw new RuntimeException(“Interrupted in loop:”, ex); } } }); thread.start(); 我已将此代码绑定到_ah / start端点,以便在实例启动后执行它。 但是,当在本地服务器上运行时,我看到_ah / start请求在运行时期间多次出现,并且它启动了多个这样的线程。 我一次只需要一个线程来减少后台处理中的争用。 有没有办法抓住现有的bg线程并检查它是否正在运行,以便可以避免新的线程创建? 更新将此代码上传到云后我还观察到,每次在后端调用_ah / start时,它会生成一个新线程作为_ah / […]

如何让Callable等到执行?

我有一个Callable,我调用了它 FutureTask task = new FutureTask(new MyCallable(name, type)); pool = Executors.newSingleThreadExecutor(); pool.submit(task); 我想知道在pool.submit(task)之后执行是否继续,或者它将等待callable完成执行? 总之,我只是想知道是否有像Callable的thread.join()这样的方法?

我们如何以循环方式使用multithreading?

我想以multithreading的方式阅读10个邮件帐户的未读邮件。 但是如果线程池大小为5,那么将从线程池中使用5个线程。 每个线程将读取一个邮件帐户。 因此,一旦Thread_1读取了第一个邮箱,它应该读取mailbox_6。 然后线程2将读取mailbox_7。 当所有邮件帐户都被读取一次后,该循环将从第一个邮件帐户开始。 我们怎么能在java中这样做?