Tag:

InheritableThreadLocal和线程池

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

Java Cached线程池和线程本地

我有一个关于java和并发的问题。 假设我有一个名为a的ThreadLocal变量。 我使用CachedThreadPool来获取新线程。 当一个线程被重新调用时,ThreadLocal变量会发生什么? 它保持相同的值(因为它是一个相同的线程)或它开始为空(好像线程是新的)? 谢谢

在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。 我的代码也没有问题,因为它运行正常而不使用线程。 提前致谢

tomcat 6线程池用于异步处理

简短的问题: 在Tomcat 6应用程序中 – 如何运行(单独的)线程池? 运行线程池的最佳解决方案是什么? 长问题: 我这里有一个简单的需要; 轮询数据库中的某些数据,同时允许Web客户端等待答复(长轮询连接)。 当数据在数据库中可用时,我会向相关客户发送回复。 这么说,我不想深入研究任何框架( quartz scheduler可能?)。 因此,正如我总结的那样,我需要一个线程池来在后台完成工作。 因此,如果Thread是我即将使用的(实际上是Runnable ),哪个类可以组织它呢? 有没有ThreadPool解决方案? 有什么建议?

如何等待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 […]

预初始化工作线程池以重用连接对象(套接字)

我需要在Java中构建一个工作池,每个工作者都有自己的连接套接字; 当工作线程运行时,它使用套接字但保持打开状态以便以后重用。 我们决定使用这种方法,因为与临时创建,连接和销毁套接字相关的开销需要太多的开销,因此我们需要一种方法,通过这种方法,工作池预先初始化其套接字连接,准备好承担工作同时保持套接字资源免受其他线程的影响(套接字不是线程安全的),所以我们需要沿着这些方向做点什么…… public class SocketTask implements Runnable { Socket socket; public SocketTask(){ //create + connect socket here } public void run(){ //use socket here } } 在应用程序启动时,我们想要初始化工作程序,并希望套接字连接也能以某种方式… MyWorkerPool pool = new MyWorkerPool(); for( int i = 0; i < 100; i++) pool.addWorker( new WorkerThread()); 当应用程序请求工作时,我们将任务发送到工作池以立即执行… pool.queueWork( new SocketTask(..)); 更新了工作代码 基于Gray和jontejj的有用评论,我得到以下代码… SocketTask public class SocketTask […]

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

我有以下使用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 ExecutorService暂停/恢复特定线程

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