Tag:

java中的字符串POOL

Java具有字符串池,因为字符串类的对象是不可变的。 但我的问题是 – 制作String POOL需要什么? 为什么字符串类没有像其他类一样保存自己的值? 内部JVM是否需要一些字符串,或者这是性能优势。 如果有,怎么样?

如何实现ExecutorService以轮换为基础执行任务?

我正在使用带有固定线程池的 java.util.concurrent.ExecutorService来执行任务列表。 我的任务列表通常大约是80到150,我将任何时候运行的线程数限制为10,如下所示: ExecutorService threadPoolService = Executors.newFixedThreadPool(10); for ( Runnable task : myTasks ) { threadPoolService.submit(task); } 我的用例要求甚至已完成的任务应该再次重新提交给ExecutorService,但只有在所有已提交的任务都得到服务/完成时才应该执行/再次执行。 基本上,提交的任务应该以轮换方式执行。 因此,在这种情况下,不会有threadPoolService.shutdown()或threadPoolService.shutdownNow()调用。 我的问题是,如何实现ExecutorService服务轮换基础任务?

newFixedThreadPool与newSingleThreadExecutor的性能问题

我正在尝试对客户端代码进行基准测试。 所以我决定编写一个multithreading程序来对我的客户端代码进行基准测试。 我想测量下面方法需要多少time (95 Percentile) attributes = deClient.getDEAttributes(columnsList); 下面是我编写的用于对上述方法进行基准测试的multithreading代码。 我在两个场景中看到很多变化 – 1)首先,使用20 threads并running for 15 minutesmultithreading代码。 我得到95百分位数为37ms 。 我正在使用 – ExecutorService service = Executors.newFixedThreadPool(20); 2)但如果我使用以下方式运行同一个程序15 minutes – ExecutorService service = Executors.newSingleThreadExecutor(); 代替 ExecutorService service = Executors.newFixedThreadPool(20); 当我用newFixedThreadPool(20)运行我的代码时,我得到95百分位为7ms ,这比上面的数字小。 任何人都可以告诉我这样的高性能问题可能是什么原因 – newSingleThreadExecutor vs newFixedThreadPool(20) 通过这两种方式,我运行我的程序15 minutes 。 以下是我的代码 – public static void main(String[] args) { try […]

Java中字符串池的基础机制?

我很好奇为什么可以在不调用new String()情况下创建new String() ,因为API提到它是class java.lang.String 那么我们如何才能使用String s=”hi”而不是String s=new String(“hi”) ? 这篇文章阐明了使用==运算符和缺少new并说这是由于String文字被JVM 中断或从文字池中取出,因此Strings是不可变的。 看到诸如此类的陈述 String s=”hi” 第一次真正发生了什么? JVM是否将其替换为String s=new String(“hi”) ,其中创建了一个Object并且将”hi”添加到String文本池中 ,因此后续调用(如String s1=”hi”取自池? 这是基础机制的运作方式吗? 如果是的话,那就是 String s=new String(“Test”); String s1=”Test”; 同样的 String s=”Test”; String s1=”Test”; 在内存利用率和效率方面 ? 另外,有什么办法可以访问字符串池来检查它中存在多少String文字,占用了多少空间等等?

如何创建LIFO执行器?

我想创建一个线程池,它将执行最近提交的任务。 关于如何实现这一点的任何建议? 谢谢

具有有界队列的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++) { […]

具有corePoolSize 0的ThreadPoolExecutor在任务队列已满之前不应执行任务

我正在经历Java Concurrency In Practice并且陷入8.3.1线程创建和拆解主题。 以下脚注警告将corePoolSize保持为零。 开发人员有时会试图将核心大小设置为零,这样工作线程最终会被拆除,因此不会阻止JVM退出,但这可能会导致在不使用a的线程池中出现一些看似奇怪的行为。用于工作队列的SynchronousQueue(如newCachedThreadPool所做的那样)。 如果池已经是核心大小,则ThreadPoolExecutor仅在工作队列已满时才创建新线程。 因此,在队列填满之前 , 提交给具有任何容量和核心大小为零的工作队列的线程池的任务将不会执行 ,这通常不是所希望的。 所以为了validation这一点,我写了这个程序,它不能像上面说的那样工作。 final int corePoolSize = 0; ThreadPoolExecutor tp = new ThreadPoolExecutor(corePoolSize, 1, 5, TimeUnit.SECONDS, new LinkedBlockingQueue()); // If the pool is already at the core size if (tp.getPoolSize() == corePoolSize) { ExecutorService ex = tp; // So tasks submitted to a thread pool with […]

关于Java字符串常量池

这是关于Java字符串常量池。 在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。 我听说Java Strings将存储在一个常量池中,它们不会被VM重新启动或加载String Quits的ClassLoader破坏。 如果是这种情况,我的密码将存储在字符串池中。 我非常关心这个问题。 有没有其他方法来摧毁这些文字或我能做的任何其他事情。 请在此建议, 此致,Sunny。