Tag: multithreading

动态线程池

我有一个长时间运行的过程,它监听事件并进行一些密集的处理。 目前我使用Executors.newFixedThreadPool(x)来限制并发运行的作业数,但是根据一天中的时间和其他各种因素,我希望能够动态增加或减少并发线程数。 如果我减少并发线程的数量,我希望当前正在运行的作业能够很好地完成。 是否有一个Java库可以让我控制并动态增加或减少在线程池中运行的并发线程数? (该类必须实现ExecutorService)。 我必须自己实施吗?

在Consumer和Producer Threads中等待并通知

刚开始学习multithreading。 我有多个线程的5个生产者和2个消费者。 基本上这个程序会在队列中添加100个项目。 当队列大小为100时,生产者将停止添加。我希望消费者在消费者从队列中删除所有项目时通知生产者,以便生产者可以再次开始添加。 目前生产者将等待,但永远不会得到消费者的通知。 制片人: public class Producer implements Runnable { private BlockingQueue sharedQueue; private final int queueSize; private Object lock = new Object(); public Producer(BlockingQueue sharedQueue, int queueSize){ this.sharedQueue = sharedQueue; this.queueSize = queueSize; } public void run() { while(true) { if(sharedQueue.size()== queueSize){ try { synchronized (lock) { sharedQueue.wait(); } } catch (InterruptedException […]

预增量运算符是否是线程安全的?

我正在用java制作一个相互竞争的汽车程序。 每辆车都是一个单独的线程。 当汽车完成比赛时,每个人都称这种方法。 我已经在不同的定时器速度下测试了这个方法,它似乎工作正常。 但我确实意识到每个线程都在访问变量carsComplete,有时是在同一时间(至少在date命令给我的范围内)。 所以我的问题是:这个方法是线程安全的吗? public static String completeRace() { Date accessDate = new Date(); System.out.println(“Cars Complete: ” + carsComplete + ” Accessed at ” + accessDate.toString()); switch(++carsComplete) { case 1: return “1st”; case 2: return “2nd”; case 3: return “3rd”; default: return carsComplete + “th”; } }

如何在java中重启线程?

我创建了一个程序来搜索源文件夹中的文件。 如果找到任何文件,它会处理该文件并将其移动到目标文件夹,然后在源文件夹中查找新文件。 它必须继续检查文件的源文件夹。 我使用线程来查找源文件夹中的文件。 我面临的问题是,在文件处理期间抛出任何exception时,线程都会停止。 即使抛出exception,我也希望线程能够运行。 它必须将导致错误的文件移动到其他文件夹并在源文件夹中查找新文件。 如何让线程继续运行? 例如: public void run() { try { searchfile(); } catch(Exception e) { e.printStackTrace(); } } public void searchfile(){ … } 更新 : 在我的问题中我应该更清楚。 实际上有4个源文件夹和4个目标文件夹。 我必须在每个源和目标对中执行相同的操作。 所以我在一个类中创建了4个线程,并在单独的类中执行操作。 class MainClass { public static void main(String[] args){ for(int i=0;i<4;i++){ SearchClass search = new SearchClass(); Thread thread = new Thread(search); thread.start(); […]

在Java 7+中,在EDT之外使用Swing repaint()方法是否仍然安全?

我知道,即使使用Swing的线程模型,从任何线程调用repaint()和其他一些选定的方法也是安全的,但是我最近在评论中告诉我,事实并非如此。 谷歌发现很多旧的讨论说它是安全的,但最近没什么。 所有以前说它安全的官方参考文献似乎已经消失了,我在各个论坛上发现了一些人讨论它是如何不再安全的。 我找不到任何正式的东西来确认它是否存在 – 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话。 考虑到破坏现有应用程序的风险有多严重,这似乎是一个非常奇怪的function。 我真的在寻找一个官方参考(即Javadoc,oracle教程或源代码链接)的链接,说明这些方法是否从任何线程调用都是安全的。 这里提到这个问题: 在EDT之外安全使用Component.repaint()? 从一个现已消失的Sun页面中引用一句话: 从任何线程调用以下JComponent方法都是安全的:repaint(),revalidate()和invalidate()。 repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate()。 这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全。 但另一方面,我找不到任何明确的说这个function已经改变。 改变笔记 可能有助于解决这个问题的是Oracle关于Swing线程处理变化的官方声明。 我找到了“Java 7中的更改”页面,但根本没有提到它,这些页面都没有提到任何方式的线程或EDT: http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html

如何在Java中阻止线程在阻塞读取操作中等待?

我有一个执行以下代码的线程: public void run() { try { int n = 0; byte[] buffer = new byte[4096]; while ((n = in.read(buffer)) != -1) { out.write(buffer, 0, n); out.flush(); } } catch (IOException e) { System.out.println(e); } } 其中是System.in 。 我怎样才能优雅地停止这样的线程? 关闭System.in和使用Thread.interrupt似乎都不起作用。

为什么同步方法允许多个线程同时运行?

我在同一个文件中有以下程序。 我已经同步了run()方法。 class MyThread2 implements Runnable { Thread t; MyThread2(String s) { t=new Thread(this,s); t.start(); } public synchronized void run() { for (int i=0;i<3;i++) { System.out.println("Thread name : "+ Thread.currentThread).getName()); try { t.sleep(1000); } catch (InterruptedException e) { e.getMessage(); } } } } class TestSync { public static void main(String[] args) { MyThread2 m1=new MyThread2("My […]

Java:线程安全的RandomAccessFile

经过一些严肃的googleing后,我发现RandomAccessFile-class不是线程安全的。 现在我可以使用一个信号量锁定所有读写但我不认为它表现得非常好。 理论上,应该可以一次执行多次读取和一次写入。 我怎么能用Java做到这一点? 有可能吗? 谢谢!

ExecutorService与Casual Thread Spawner

我有一个关于ExecutorService如何在Java中工作的基本问题。 很难看到简单地创建Threads以并行执行某些任务和将每个任务分配给ThreadPool之间的区别。 ExecutorService看起来也非常简单有效,所以我想知道为什么我们不会一直使用它。 这只是一种比另一种方式更快地执行其工作的问题吗? 这里有两个非常简单的例子来说明两种方式之间的区别: 使用执行程序服务:Hello World(任务) static class HelloTask implements Runnable { String msg; public HelloTask(String msg) { this.msg = msg; } public void run() { long id = Thread.currentThread().getId(); System.out.println(msg + ” from thread:” + id); } } 使用执行程序服务:Hello World(创建执行程序,提交) static class HelloTask { public static void main(String[] args) { int ntasks = […]

在ThreadLocalRandom上随机

java.util.Random的实例是线程安全的。 但是,跨线程并发使用相同的java.util.Random实例可能会遇到争用,从而导致性能不佳。 请考虑在multithreading设计中使用ThreadLocalRandom。 什么样的争用,从而表现不佳? 有人可以,在这里解释一下吗? 我不知道Random和ThreadLocalRandom里面的算法是什么让它们与众不同。