Tag: multithreading

如何在Spring Batch中设置multithreading?

我已经成功建立了一个Spring Batch项目教程。 我真的很想知道是否可以在“Spring级别”使它成为multithreading。 我想要的基本思路是制作一个任务列表或任务步骤,让它们被独立的线程拾取和处理,理想情况下是一个限于’n’个线程的池。 这可能吗? 如果是这样,怎么样? 有人可以从我目前所在的地方指导我到那一点吗? 我所拥有的简单项目来自本教程。 它基本上有不同的任务,可以将信息打印到屏幕上。 这是我当前的simpleJob.xml文件,其中包含作业详细信息: 我的appContext包含作业存储库bean( SimpleJobRepository ),事务管理器( ResourceLessTransactionManager )和作业启动器( SimpleJobLauncher )。 如果需要的话,我也可以提供这个代码,我只是不想用大量的XML来破坏这篇文章。 非常感谢您的帮助!

JavaFX中的multithreading挂起了UI

我有一个简单的JavaFX 2应用程序,有2个按钮,分别是Start和Stop。 单击开始按钮时,我想创建一个后台线程,它将进行一些处理并在其进行时更新UI(例如进度条)。 如果单击停止按钮,我希望线程终止。 我试图使用javafx.concurrent.Task类来完成此操作,我从文档中收集这个类可以正常工作。 但是每当我单击“开始”时,UI就会冻结/挂起而不是保持正常。 她的主要Myprogram extends Application代码Myprogram extends Application类来显示按钮: public void start(Stage primaryStage) { final Button btn = new Button(); btn.setText(“Begin”); //This is the thread, extending javafx.concurrent.Task : final MyProcessor handler = new MyProcessor(); btn.setOnAction(new EventHandler() { public void handle(ActionEvent event) { handler.run(); } }); Button stop = new Button(); stop.setText(“Stop”); stop.setOnAction(new EventHandler() […]

在我的例子中,Synchronized和Lock有什么区别?

我写了一个简单的代码来使用Lock和synchronized来模拟并发。 源代码如下: Task类包含一个名为doSomething()的方法来打印线程名称并执行已用时间。 import java.util.Calendar; public class Task { public void doSomething() { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } StringBuilder sb = new StringBuilder(); //Thread Name sb.append(“Thread Name: “).append(Thread.currentThread().getName()); //Timestamp for the executing sb.append(“, elaspsed time: “).append(Calendar.getInstance().get(13)).append(” s “); System.out.println(sb.toString()); } } TaskWithLock类 import java.util.concurrent.locks.Lock; import […]

线程中的静态同步和非静态同步方法

任何人都可以解释声明……“静态同步方法和非静态同步方法不会相互阻塞 – 它们可以同时运行”

在Java中指定任务顺序执行

我搜索了很多但找不到任何解决方案。 我用这样的方式使用java线程池: ExecutorService c = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; ++i) { c.execute(new MyTask(i)); } 以这种方式,任务以后续顺序执行(如在队列中)。 但我需要改变“选择下一个任务”策略。 所以我希望为每个任务分配指定优先级(它不是线程优先级),并且执行任务对应于这些优先级。 因此,当执行程序完成另一个任务时,它会将下一个任务选为具有最高优先级的任务。 它描述了常见问题。 也许有更简单的方法不考虑优先级。 它选择最后添加的任务作为执行而不是第一次添加。 粗略地讲,FixedThreadPool使用FIFO策略。 我可以使用例如LIFO策略吗?

易变量和其他变量

以下是来自经典Concurency in Practice : 当线程A写入volatile变量并且随后线程B读取相同的变量时,在写入volatile变量之前A可见的所有变量的值在读取volatile变量后变为B可见。 我不确定我是否真的能理解这句话。 例如,在这种情况下所有变量的含义是什么? 这是否意味着使用volatile也会对非易失性变量的使用产生副作用? 在我看来,这句话有一些我无法理解的微妙含义。 有帮助吗?

Java线程设置为null时会发生什么?

线程启动后,如果线程的引用设置为null ,那么线程会发生什么? 它会停止吗? 它有资格获得GC吗? 喜欢这个: t.start(); t = null;

为什么线程会自动从wait()中唤醒?

我想知道为什么线程会自动从java中的wait()中唤醒。 这是一个设计决定吗? 这是妥协吗? 编辑:(来自Java Concurrency in Practice,p.300) wait甚至被允许返回“虚假” – 不响应任何调用通知的线程。 作者进一步指出: 这就像一个连接器松动的烤面包机,当烤面包准备好时,铃铛会关闭,有时候还没有准备好。 这就是为什么你总是需要像 synchronized(this){ while(!condition) wait(); } } 永不 synchronized(this){ if(!condition){ wait(); } } 即使条件仅从false转换为true 。

删除ThreadPoolExecutor的所有排队任务

我有关于ThreadPoolExecutor的这个相当简单的问题。 我有以下情况:我必须从队列中使用对象,为它们创建适当的工作任务并将它们提交给ThreadPoolExecutor。 这很简单。 但在关闭情况下, 许多工作人员可能会排队等待执行。 由于其中一个任务可能运行了一个小时,并且我想要相对快速地正常关闭应用程序,我想从ThreadPoolExecutor中丢弃所有排队的任务,而已经处理的任务应该正常完成。 ThreadPoolExecutor文档有一个remove()方法,但只允许删除特定的任务。 purge()仅适用于已取消的Future任务。 我的想法是清除队列中包含所有排队的任务。 ThreadPoolExecutor提供对此内部队列的访问,但文档指出: 方法getQueue()允许访问工作队列以进行监视和调试。 强烈建议不要将此方法用于任何其他目的。 所以抓住这个队列并清除它不是一个选择。 此外,该文档的片段说: 当大量排队的任务被取消时,两个提供的方法remove(java.lang.Runnable)和purge()可用于协助存储回收。 怎么样? 当然,我可以维护我提交给执行程序的所有任务的列表,在关闭的情况下,我遍历所有条目并使用remove()方法从ThreadPoolExecutor中删除它们……但是…来吧,这是一个浪费记忆力和维护这份清单的麻烦。 (例如删除已执行的任务) 我感谢任何提示或解决方案!

Java ExecutorService暂停/恢复特定线程

有没有办法使用ExecutorService来暂停/恢复特定的线程? private static ExecutorService threadpool = Executors.newFixedThreadPool(5); 想象一下,我想停止线程,因为id = 0(假设为每个线程分配一个增量id,直到达到线程池的大小)。 过了一会儿,按一个按钮让我们说,我想恢复那个特定的线程,并让所有其他线程保持其当前状态,可以暂停或恢复。 我在Java文档中找到了一个未完成的PausableThreadPoolExecutor版本。 但它不适合我需要的东西,因为它恢复了池中的所有线程。 如果没有办法使用ExecutorService的默认实现,那么任何人都可以指出我对这个问题的Java实现吗? 谢谢!