Tag: multithreading线程

具有有界队列的Java线程池

我正在使用java.util.concurrent的Executors类来创建一个固定的线程池,用于运行Web服务器的请求处理程序: static ExecutorService newFixedThreadPool(int nThreads) 而描述是: 创建一个线程池,该线程池重用一组在共享无界队列中运行的固定线程。 但是,我正在寻找线程池实现,它将执行完全相同的操作,除了有界队列。 有没有这样的实施? 或者我是否需要为固定线程池实现自己的包装器?

关于为非守护程序线程提供一些服务的守护程序线程

我有一个查询,我已经开发了一个名为thread one和thread two的多个线程下面的代码,下面是代码.. class multip实现Runnable { public void run() { for (int i = 0; i < 20; i++) { try { Thread.sleep(500); System.out.println(Thread.currentThread().getName()); System.out.println("i"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public class MultiThread3 { public static void main(String… a) { multip obj = new multip(); […]

在线程池实现的代码中存在疑问

花了很多时间在线程池概念上,通过在Stackoverflow.com上阅读博客数量和发布问题的不同代码,现在我得到了这个概念的清晰图像。 但与此同时,我在代码中发现了一些疑问。 当pool.assign(new TestWorkerThread()); 在TestThreadPool类中执行,它调用done.workerBegin(); 在Done Class中的方法,它增加_activeThreads变量。 但我认为, 逻辑上这是不正确的,因为如果线程数少于(在这种情况下为2)任务数(在TestThreadPool类中给出)(在本例中为5),它会增加_activeThreads (即_activeThreads = 5) )不必要的计数。 什么_started变量在Done类中做了什么? waitDone()和waitBegin() (在完成类中 )如何执行它们的function? (如果你一步一步地解释这两种方法,那就好了。) 代码如下。 我根据它的流程安排代码。 TestThreadPool类: – package hitesh; /** * * @author jhamb */ public class TestThreadPool { public static void main(String args[]) throws InterruptedException { ThreadPool pool = new ThreadPool(2); for (int i = 1;i <= 5;i++) { […]

InheritableThreadLocal和线程池

我有一个问题,我真的不认为有解决方案,但无论如何我会在这里尝试。 我的应用程序使用线程池,并且此池中的某些线程具有可inheritance的线程局部变量。 我已经扩展了ThreadPoolExecutor类,以便在线程完成执行时基本清除线程局部变量(在afterExecute回调方法中)。 我知道当你有一个InheritableThreadLocal变量时,在初始化线程时调用childValue()方法以从父线程获取ThreadLocal变量的值。 但是,在我的情况下,下次使用该线程时(在使用一次之后),InheritableThreadLocal变量的值为null(因为它之前已在afterExecute中清除)。 有没有办法在beforeExecute中访问父线程的线程局部变量,这样我就可以基本上模拟在创建线程时InheritableThreadLocal中的childValue方法。

在ThreadPoolExecutor中测试PriorityBlockingQueue

我在这个例子中实现了我的ThreadPoolExecutor和PriorityBlockingQueue: https : //stackoverflow.com/a/12722648/2206775 并写了一个测试: PriorityExecutor executorService = (PriorityExecutor) PriorityExecutor.newFixedThreadPool(16); executorService.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); Thread.sleep(1000); System.out.println(“1”); } catch (InterruptedException e) { e.printStackTrace(); } } }, 1); executorService.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); Thread.sleep(1000); System.out.println(“3”); } catch (InterruptedException e) { e.printStackTrace(); } } }, […]

使用ThreadPoolExecutor,如何获取线程池中运行的线程的名称?

我在Java中使用ThreadPoolExecutor来管理许多正在运行的线程。 我创建了自己的简单ThreadFactory因此我可以为线程提供更好的名称。 问题是,首次创建线程池时,名称将在线程中设置,并且不与线程池实际运行的任务相关联。 我理解这一点……我的Runnables和Callables – 尽管它们有名字 – 实际上是ThreadPoolExecutor运行线程的一个抽象层次。 StackOverflow上还有一些关于为ThreadPoolExecutor线程池创建名称的问题。 (请参阅如何为可调用线程命名?以及如何在Java中命名线程池的线程 。) 我想知道的是:有没有人有一个很好的解决方案来保持线程池线程的名称与它实际运行的Runnable同步? 即如果我调用Thread.getCurrentThread().getName()我不希望它返回顶级线程池的名称,而是返回线程当前正在运行的Callable / Runnable的名称。 由于这主要用于调试和日志记录,我试图避免一个解决方案,涉及我将新代码放入可能提交给ThreadPoolExecutor的每个Runnable中 – 我只是将一些代码放入ThreadFactory或包装ThreadPoolExecutor本身,以便在一个地方完成更改。 如果不存在这样的解决方案,我可能不会打扰,因为它不是关键任务。 开始编辑为了澄清,我知道我可以放一个Thread.currentThread().setName( “my runnable name” ); 作为每个Runnable的run方法的第一行,但我试图避免这样做。 我在这里是一个完美主义者,我意识到这一点,所以如果人们想对这个问题发表意见并告诉我,我不会被冒犯。 结束编辑 我想,我的另一个问题是人们是否认为做这样的事情是个坏主意。 我是否应该像这样更新线程池名称? 谢谢你的任何建议!

使用线程同时运行两个独立任务

我已经在java中学习了许多关于线程的教程,但我无法找到答案。 我的问题是:如何同时运行两个独立的线程? 我的情况是:我有两个任务; 将一些数据保存到数据库中 在移动设备上发送推送通知。 由于这两个任务是独立的,我想同时执行它们。 我尝试使用具有两个线程的线程池,但问题是数据库任务很快完成,但发送推送通知需要一些时间。 因此,当一个任务完成而另一个任务仍未决时,它会抛出exception。 我的代码也没有问题,因为它运行正常而不使用线程。 提前致谢

如何等待ThreadPoolExecutor完成

我的问题:如何在ThreadPoolExecutor上执行一堆线程对象并等待它们全部完成然后再继续? 我是ThreadPoolExecutor的新手。 所以这段代码是一个测试它是如何工作的测试。 现在我甚至没有用对象填充BlockingQueue ,因为我不理解如何在不使用另一个RunnableObject调用execute()情况下启动队列。 无论如何,现在我只是打电话给awaitTermination()但我想我仍然缺少一些东西。 任何提示都会很棒! 谢谢。 public void testThreadPoolExecutor() throws InterruptedException { int limit = 20; BlockingQueue q = new ArrayBlockingQueue(limit); ThreadPoolExecutor ex = new ThreadPoolExecutor(limit, limit, 20, TimeUnit.SECONDS, q); for (int i = 0; i < limit; i++) { ex.execute(new RunnableObject(i + 1)); } ex.awaitTermination(2, TimeUnit.SECONDS); System.out.println("finished"); } RunnableObject类: package playground; public […]

与另一个任务并行运行任务

我有以下使用FooProcessor类的Foo类。 所以我想要做的是,在运行cp1实例进程方法的同时,我想运行cp2.process() 。 public class Foo { public static void main(String [] args){ FooProcessor cp1 = new FooProcessor(); FooProcessor cp2 = new FooProcessor(); cp1.process(); // in parallel process cp2.process(); } } public class FooProcessor { public void process(){ System.out.println(“Processing..”); } } 但是,我想顺序cp1,所以我希望它运行并完成,如果cp2没有完成或失败它是好的。 如果它失败了我想加入结果。 它没有返回此示例中的任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗? 还是线程? 我只希望cp2与cp1并行运行。 或者如果我添加更多让我们说cp3,我希望它与cp1并行运行。

Java中的线程内的线程?

我目前正在考虑如何在Java中设计一个需要进行大量网络处理和数据库存储的multithreading系统。 该程序将首先启动三个基本线程。 沿着这些基本线程,我想启动其他线程不是来自主程序,而是来自两个线程。 是否有可能线程启动另一个线程,导致某种层次结构,如: > Parent ->t0 thread1 -> t1 tread1.1 > ->t0 thread2 > ->t0 thread3 -> t2 thread3.1 t0= inital time t1,t2 = time at a point in the running thread t1 != t2 如果没有,有人可以提供参考的理论解决方案吗?