/// <summary> /// Default Constructor /// </summary> /// <param name="firstTask">Task to run before entering run loop.</param> /// <param name="parentThreadPoolExecutor"><see cref="ThreadPoolExecutor"/> that controls this worker</param> internal Worker(ThreadPoolExecutor parentThreadPoolExecutor, IRunnable firstTask) { FirstTask = firstTask; _parentThreadPoolExecutor = parentThreadPoolExecutor; Thread = parentThreadPoolExecutor.ThreadFactory.NewThread(this); }
/// <summary> /// Obtains and ignores the next task that the <paramref name="executor"/> /// would otherwise execute, if one is immediately available, /// and then retries execution of task <paramref name="runnable"/>, /// unless the <paramref name="executor"/> is shut down, in which /// case task <paramref name="runnable"/> is instead discarded. /// </summary> /// <param name="runnable"> /// The <see cref="IRunnable"/> task requested to be executed. /// </param> /// <param name="executor"> /// The <see cref="ThreadPoolExecutor"/> attempting to execute this /// task. /// </param> public virtual void RejectedExecution(IRunnable runnable, ThreadPoolExecutor executor) { if (executor.IsShutdown) return; IRunnable head; executor.Queue.Poll(out head); executor.Execute(runnable); }
/// <summary> /// Does nothing, which has the effect of discarding task /// <paramref name="runnable"/>. /// </summary> /// <param name="runnable"> /// The <see cref="IRunnable"/> task requested to be executed. /// </param> /// <param name="executor"> /// The <see cref="ThreadPoolExecutor"/> attempting to execute this /// task. /// </param> public virtual void RejectedExecution(IRunnable runnable, ThreadPoolExecutor executor) { }
/// <summary> /// Always throws <see cref="RejectedExecutionException"/>. /// </summary> /// <param name="runnable"> /// The <see cref="IRunnable"/> task requested to be executed. /// </param> /// <param name="executor"> /// The <see cref="ThreadPoolExecutor"/> attempting to execute this task. /// </param> /// <exception cref="RejectedExecutionException"> /// Always thrown upon execution. /// </exception> public virtual void RejectedExecution(IRunnable runnable, ThreadPoolExecutor executor) { throw new RejectedExecutionException("IRunnable: " + runnable + " rejected from execution by ThreadPoolExecutor: " + executor); }
/// <summary> /// Executes task <paramref name="runnable"/> in the caller's /// thread, unless <paramref name="executor"/> has been shut down, /// in which case the task is discarded. /// <param name="executor">the executor attempting to execute this task</param> /// <param name="runnable">the runnable task requested to be executed</param> /// </summary> public void RejectedExecution(IRunnable runnable, ThreadPoolExecutor executor) { if (executor.IsShutdown) return; runnable.Run(); }
/// <summary> /// Creates a PeerGroup with the given parameters. The connectionDelayMillis parameter controls how long the /// PeerGroup will wait between attempts to connect to nodes or read from any added peer discovery sources. /// </summary> public PeerGroup(IBlockStore blockStore, NetworkParameters @params, BlockChain chain, int connectionDelayMillis) { _blockStore = blockStore; _params = @params; _chain = chain; _connectionDelayMillis = connectionDelayMillis; _inactives = new LinkedBlockingQueue<PeerAddress>(); _peers = new SynchronizedHashSet<Peer>(); _peerDiscoverers = new SynchronizedHashSet<IPeerDiscovery>(); _peerPool = new ThreadPoolExecutor(_coreThreads, _defaultConnections, TimeSpan.FromSeconds(_threadKeepAliveSeconds), new LinkedBlockingQueue<IRunnable>(1), new PeerGroupThreadFactory()); }