Tag: multithreading

创建两个线程,一个显示奇数和其他偶数

我正在尝试创建两个线程,一个线程显示从0到10的整数,一个线程显示从1到11的奇数。以下代码是否适合设计此程序? public class Mythread { public static void main(String[] args) { Runnable r = new Runnable1(); Thread t = new Thread(r); t.start(); Runnable r2 = new Runnable2(); Thread t2 = new Thread(r2); t2.start(); } } class Runnable2 implements Runnable{ public void run(){ for(int i=0;i<11;i++){ if(i%2 == 1) System.out.println(i); } } } class Runnable1 implements Runnable{ […]

tomcat中有100个线程TIMED_WAITING,导致它在线程总数超过200时停止

最近我们的一个生产tomcat服务器没有响应,因为tomcat的繁忙线程高达200.当我们在重新启动之前进行线程转储时,我们在TIMED_WAITING状态下获得了100个线程,就像这3个线程一样: “”http-bio-7007″-exec-241” daemon prio=10 tid=0x00002aaab107b000 nid=0x59df waiting on condition [0x0000000051239000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) – parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662) “”http-bio-7007″-exec-237” daemon prio=10 tid=0x00002aaab186e000 nid=0x596d waiting on condition [0x000000004d1f9000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) – […]

ConcurrentHashMap.get()是否保证通过不同的线程看到以前的ConcurrentHashMap.put()?

ConcurrentHashMap.get() 保证通过不同的线程看到以前的ConcurrentHashMap.put() ? 我的期望是,并且阅读JavaDocs似乎表明了这一点,但我99%确信现实是不同的。 在我的生产服务器上,下面似乎正在发生。 (我已经记录了它。) 伪代码示例: static final ConcurrentHashMap map = new ConcurrentHashMap(); //sharedLock is key specific. One map, many keys. There is a 1:1 // relationship between key and Foo instance. void doSomething(Semaphore sharedLock) { boolean haveLock = sharedLock.tryAcquire(3000, MILLISECONDS); if (haveLock) { log(“Have lock: ” + threadId); Foo foo = map.get(“key”); log(“foo=” […]

使用JAX-RS的REST – 处理长时间运行的操作

我有一个用JAX-RS实现的REST服务。 有些操作需要很长时间才能完成,可能需要15-30分钟。 对于这些情况,我倾向于派遣后台线程来处理长时间运行的操作,然后立即响应HTTP状态202 ACCEPTED。 响应将包含一个带有URL的位置标头,客户端可以使用该标头来轮询进度。 此方法需要创建线程来处理长时间运行的操作,以便可以立即返回202 ACCEPTED。 我也知道在Java EE容器中创建自己的线程通常是不好的做法! 我的问题如下: 人们都同意这是一种正确的方法吗? 假设它是正确的,人们可以推荐一个“良好实践”解决方案,使我能够在后台调度长时间运行并立即返回吗? 另外,为了避免管理我自己的线程,我查看了JAX-RS异步服务器api。 不幸的是,虽然这提高了服务器吞吐量,但它不允许我立即响应ACCEPTED。 泽西州声明如下: Note that the use of server-side asynchronous processing model will not improve the request processing time perceived by the client. It will however increase the throughput of the server, by releasing the initial request processing thread back to the I/O […]

catalina.out中的这些警告是什么?

我在Tomcat 7中有一个Web应用程序。 当我关闭Tomcat时,我看到了这些警告(但并非总是如此) SEVERE: The web application [/MyApplication] created a ThreadLocal with key of type [org.apache.xml.security.algorithms.MessageDigestAlgorithm$1] (value [org.apache.xml.security.algorithms.MessageDigestAlgorithm$1@2e2c2e2c]) and a value of type [java.util.HashMap] (value [{http://www.w3.org/2000/09/xmldsig#sha1=MESSAGE DIGEST SHA-1}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. […]

lucene良好的实践和线程安全

我正在使用lucene索引文档并执行搜索,之后我立即删除它们。 所有这些都可以被视为一个有点primefaces的动作,包括以下步骤: index(writer) – > search(searcher) – >按分数获取文档(读者) – >删除文档(读者) 此操作可以由同一索引上的多个并发线程执行(使用FSDirectory )。 重要说明:每个线程处理一组单独的文档,因此一个线程不会触及另一个线程的文档 为此我有几个问题: 1)我应该使用IndexWriter , IndexReader和IndexSearcher的单个实例(对于所有线程)吗? (它们应该是线程安全的) 2) IndexWriter可以操作索引,而IndexReader删除文档吗? 我是否需要关闭另一个才能做到这一点? 意思是,一个线程可以写入索引而另一个线程从中删除(如前所述,我可以保证它们处理单独的数据集) 3)您将获得的任何其他良好做法和建议将非常受欢迎。 非常感谢!

为什么要捕获InterruptedException来调用Thread.currentThread.interrupt()?

在Effective Java(第275页)中,有以下代码段: … for (int i = 0; i < concurrency; i++) { executor.execute(new Runnable() { public void run() { ready.countDown(); try { start.await(); action.run(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { done.countDown(); } } } … 捕获被中断的exception只是为了重新提升它有什么用? 为什么不让它飞?

如何无限期地在Java中暂停一个线程然后恢复它?

也许这个问题以前曾被问过很多次,但我从未找到过令人满意的答案。 问题: 我必须使用循环策略来模拟进程调度程序。 我正在使用线程来模拟进程和多道程序设计; 一切正常,JVM管理线程。 但问题是,现在我想控制所有线程,这样我就可以通过一定量(或时间)单独运行每个线程,就像真正的OS进程调度程序一样。 我在想什么: 我希望有一个所有线程的列表,因为我迭代列表我想为每个线程执行相应的量程,但是一旦时间到了,我想无限期地暂停该线程,直到列表中的所有线程都被执行,然后我到达同一个线程再次恢复它,依此类推。 问题是: 那么他们是一种方法,不使用弃用的方法stop(),suspend()或resume()来控制线程吗?

Java RMI和线程同步问题

我实际上有两个关于Java RMI和线程同步的问题: 1)如果我将RMI远程方法实现为同步,它们是否保证互斥? 我需要确保没有两个我的RMI方法(提供给客户端的方法)同时执行。 2)我有一个服务器定期执行的方法。 它用于清理。 当远程客户端运行/使用任何RMI方法时,我必须确保不执行此特定方法。 此外,当该方法运行时,不应该进行RMI调用。 即客户必须等待。 知道我怎么能这样做吗? 我读过有关Locks的内容,但我不知道如何在这种情况下使用它们。 我已经考虑过将RMI方法实现为静态并在RMI接口中包含清理方法,但它似乎并不是解决问题的优雅方法。 我还将RMI接口内的清理方法编写为synchronized。 当我运行它进行测试时,方法之间似乎没有冲突,但我无法确定。 谢谢你的时间和答案。

为什么(javax.servlet。)不推荐使用SingleThreadModel?

为什么不推荐使用javax.servlet.SingleThreadModel ?