Tag: multithreading

生产者消费者程序在Java中使用wait()和notify()

我正在使用低级同步和wait()和notify()在Java中执行经典的Producer-Consumer问题。 我知道有更好的实现使用java.util.concurrent包中的结构,但我的问题围绕低级实现: private static ArrayList list = new ArrayList(); static Object obj = new Object(); public static void producer() throws InterruptedException { synchronized (obj) { while (true) { if (list.size() == 10) { System.out.println(“Queue full.. Waiting to Add”); obj.wait(); } else { int value = new Random().nextInt(100); if (value <= 10) { Thread.sleep(200); System.out.println("The element […]

Atomic Integer incrementAndGet()线程安全吗?

primefaces整数incrementAndGet()方法线程安全吗? 我没有看到在其中使用synchronized关键字。 我使用以下代码生成唯一ID: public enum UniqueIdGenerator { INSTANCE; private AtomicLong instance = new AtomicLong(System.currentTimeMillis()); public long incrementAndGet() { return instance.incrementAndGet(); } } 如果调用该方法生成唯一ID的多个线程会导致任何问题,我会徘徊吗? UniqueIdGenerator.INSTANCE.incrementAndGet() 谢谢!

一分钟后立即停止线程

我有一个JButton来调用我的线程。 但我真正想做的是在一分钟之后停止线程! 我的actionListener方法是: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { new Frame2().setVisible(true); Thread t=new Thread(new Frame2()); t.start(); } 我运行一分钟的线程如下: public void run(){ int i; while(!Thread.currentThread().isInterrupted()){ for(i=0;i<=100;i++){ if(i==100){ Thread.currentThread().interrupt(); } try { Thread.currentThread().sleep(600); } catch (InterruptedException ex) { System.out.print("THREAD CLOSED"); return; } } System.out.print("DOING THINGS BLA BLA"); } } 问题:我成功地在一分钟后停止了线程,但我无法做任何想要的事情。 我只想知道如何才能实现这一点,以便只运行一分钟线程,并在线程中我想做我的事情! 但是怎么样? 我错了这种方法吗? 如果,是的那么什么应该是正确的方法?

有多少个线程可以同时调用对象的非同步方法?

所以,假设我有一个带有方法m的类X. 方法m 不是同步的,它不需要,因为它不会真正改变X类型的对象x的状态。 在某些线程中,我调用这样的方法:xm()。 所有这些线程都使用相同的对象x。 这个方法(方法m)可以同时在对象x上调用多少个线程? 可能是这个方法被调用,比方说,100个线程是我的应用程序的瓶颈? 谢谢。

排队多个下载,寻找生产者消费者API

我有一个应用程序(一个servlet,但这不是很重要),它下载一组文件并解析它们以提取信息。 到目前为止,我在循环中完成了这些操作: – 在Internet上获取新文件 – 分析它。 multithreading下载管理器似乎是解决此问题的更好解决方案,我希望以尽可能最快的方式实现它。 某些下载依赖于其他下载(因此,此集合已部分订购)。 multithreading编程很难,如果我能找到一个API来做到这一点我会很高兴。 我需要将一组文件(已排序)放入队列中,并获取完全下载的第一组文件。 你知道我可以用来实现的任何库吗? 此致,Stéphane

在Java 6中,为什么即使优先级较低的线程产生,优先级较高的线程也不会运行?

在下面的代码中,我试图通过产生优先级较低的线程来获得更高优先级的线程。 但它似乎不起作用,优先级较高的线程似乎在较低优先级的线程完成后运行。 谁能解释我做错了什么? import java.util.ArrayList; import java.util.List; public class TestThreadPriority extends Thread { static List messages = new ArrayList(); public void run() { Thread t = Thread.currentThread(); int priority = t.getPriority(); String name = t.getName(); messages.add(name + “:” + priority); Thread.yield(); messages.add(name + “:” + priority); } public static void main(String[] args) { // TODO […]

如何等待并通知工作?

我需要知道wait()和notify()是如何工作的? 我无法通过使用wait()和notify()来实现它的工作。 相反,如果我使用while()循环进行等待,它可以正常工作。 怎么回事? 为什么我不能简单地使用wait()和notify()?

如何使用java并行流而不是executorThreadsPool?

我想编写一个测试,对我的API执行许多并行调用。 ExecutorService executor = Executors.newCachedThreadPool(); final int numOfUsers = 10; for (int i = 0; i { final Device device1 = getFirstDevice(); final ResponseDto responseDto = devicesServiceLocal.acquireDevice(device1.uuid, 4738); if (responseDto.status == Status.SUCCESS) { successCount.incrementAndGet(); } }); } 我知道我可以使用executorThreadsPool来做到这一点,如下所示: devicesList.parallelStream() .map(device -> do something) 我可以用java8并行流创建它: 我怎么能在一台设备上做到这一点? 这意味着我很少想要获得相同的设备。 像这样的东西: {{device}}.parallelStream().execute(myAction).times(10)

如何更改垃圾收集线程的优先级?

这个问题是重复的是否可以更改垃圾收集器线程的优先级? 这是一个古老的问题,从那以后事情可能会发生很大的变化。 它也没有澄清一切。 是否可以更改GC线程优先级? 我见过具有不同GC线程优先级的线程转储。 如果我们无法改变它,会发生什么? 此外,我知道高频交易平台希望保持GC线程优先级非常低,以便主线程在大多数时间运行,并且“停止世界”事件不会经常发生。

主线程上的Android http请求错误

我在我的Android应用程序中使用Kevin Sawicki的库来处理HTTP请求。 用于发出请求的库方法的实际调用是在名为TemplateHelper的类文件(它不是从活动中调用)中进行的。 在我的TemplateHelper类中调用HttpRequest库的方法如下所示 public static JSONObject GetTemplates() { try { return new JSONObject(HttpRequest.get(“http://myapi.mycompany.com/templates”).body()); } catch (HttpRequestException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } 从我的活动我然后调用TemplateHelper.GetTemplates()来获取数据。 但是,当我这样做时,Android会抛出exceptionandroid.os.NetworkOnMainThreadException 。 快速谷歌搜索向我展示了在单独的线程上运行HTTPRequest的代码。 但是,如果我在一个单独的线程中运行代码,我怎么能将结果返回到主线程?