我正在寻找一个可以提供超时的ExecutorService实现。 如果提交给ExecutorService的任务的运行时间超过了超时时间,则会中断该任务。 实现这样一个野兽并不是一件困难的事情,但是我想知道是否有人知道现有的实现。 以下是我在下面的一些讨论中提出的。 任何意见? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) { super(corePoolSize, […]
什么时候应该使用ThreadLocalvariables? 它是如何使用的?
我有两个SwingWorker类: FileDivisionThread和FileDivisionThread 我将执行这两个线程。 行计数结束后,会将结果传递给文件分割线程。 我不知道如何将结果传递给启动的线程。
如果有两个线程访问一个全局variables,那么很多教程都会说variables是volatile的,以防止编译器将这个variablescaching在一个寄存器中,从而不能正确更新。 然而,两个线程都访问一个共享variables是通过互斥体来保护的东西,不是吗? 但是在这种情况下,在线程locking和释放互斥体之间,代码是在一个只有一个线程可以访问variables的关键部分,在这种情况下,variables不需要是易失性的? 那么在multithreading程序中volatile的用途和用途是什么呢?
我有一个简单的Java程序,读取文本文件,“”(空格),显示第一个单词,等待2秒,显示下一个…等等…我想在spring这样做,或一些其他的GUI。 关于如何轻松更新spring的话的任何build议? 遍历我的列表,并以某种方式使用setText(); 我没有任何运气。 我使用这种方法在CONSOL中打印出我的单词,并添加了JFrame …在CONSOL中很好的工作,但是提供了无穷无尽的jframe。 我在网上发现了大部分。 private void printWords() { for (int i = 0; i < words.size(); i++) { //How many words? //System.out.print(words.size()); //print each word on a new line… Word w = words.get(i); System.out.println(w.name); //pause between each word. try{ Thread.sleep(500); } catch(InterruptedException e){ e.printStackTrace(); } JFrame frame = new JFrame("Run Text File"); […]
并发VS并行 – 有什么区别? 任何例子
受到SET NOCOUNT有不同观点的这个问题的启发… 我们应该使用SQL Server的SET NOCOUNT ON吗? 如果没有,为什么不呢? 它的作用编辑6,2011年7月22日 它抑制任何DML之后的“xx rows affected”消息。 这是一个结果集,当发送时,客户端必须处理它。 它很小,但是可以测量(见下面的答案) 对于触发器等,客户端将收到多个“受影响的xx行”,这会导致一些ORM,MS Access,JPA等所有错误的方式(见下面的编辑) 背景: 一般接受的最佳实践(我认为,直到这个问题)是在SQL Server中的触发器和存储过程中使用SET NOCOUNT ON 。 我们在任何地方都使用它,并且快速的谷歌显示了许多SQL Server MVP也同意。 MSDN说这可以打破.net SQLDataAdapter 。 现在,这意味着SQLDataAdapter仅限于完全简单的CRUD处理,因为它期望“n行受影响”消息匹配。 所以,我不能使用: 如果存在,以避免重复(不受行影响的消息) 注意:谨慎使用 不存在(更less行然后预期 过滤出微不足道的更新(例如,实际上没有数据发生变化) 做任何表访问之前(如日志logging) 隐藏复杂性或denormlisation 等等 在marc_s(谁知道他的SQL的东西)的问题说,不要使用它。 这与我认为的不同(我也认为我自己在SQL方面也有点胜任)。 有可能我错过了一些东西(随便指出一些明显的东西),但是你们有什么想法呢? 注意:我看到这个错误已经有好几年了,因为我现在不使用SQLDataAdapter。 评论和问题后编辑: 编辑:更多的想法… 我们有多个客户端:一个可以使用C#SQLDataAdaptor,另一个可以使用Java的nHibernate。 SET NOCOUNT ON可能会以不同的方式影响这些SET NOCOUNT ON 。 如果你把存储过程看作是方法,那么为了你自己的目的,假定某些内部处理以某种方式工作,这是坏forms(反模式)。 编辑2: 触发打破nHibernate问题 ,其中SET NOCOUNT ON不能设置 […]
是否有可能为Java 8 并行stream指定自定义线程池? 我找不到任何地方。 想象一下,我有一个服务器应用程序,我想使用并行stream。 但是,应用程序是大型的,multithreading的,所以我想划分它。 我不想在另一个模块的应用程序块任务的一个模块中运行缓慢的任务。 如果我不能为不同的模块使用不同的线程池,这意味着我不能在大多数现实世界的情况下安全地使用并行stream。 试试下面的例子。 有一些CPU密集型任务在单独的线程中执行。 任务利用并行stream。 第一个任务是打破的,所以每一步需要1秒钟(由线程睡眠模拟)。 问题是其他线程卡住,等待中断的任务完成。 这是人为的例子,但想象一下,一个servlet应用程序和一个长期运行的任务提交给共享fork连接池的人。 public class ParallelTest { public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -> runTask(1000)); //incorrect task es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.shutdown(); es.awaitTermination(60, TimeUnit.SECONDS); } private […]
我需要一次执行一些任务4,如下所示: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(…) { taskExecutor.execute(new MyTask()); } //…wait for completion somehow 一旦所有这些都完成,我怎么能得到通知? 现在我想不出比设置一些全局任务计数器好多less,并在每个任务结束时减less它,然后在无限循环监视这个计数器变成0; 或者得到一份期货清单,并在无限循环监测isDone所有这些。 什么是不涉及无限循环的更好的解决scheme? 谢谢。
有没有人可以告诉我同步方法优于同步块的例子?