Tag: multithreading

如何在使用具有线程超时function的ExecutorService时提高性能?

我不是multithreading专家,但我发现当前使用ExecutorService代码存在一些性能问题。 我正在开发一个项目,在这个项目中我需要对我的服务器进行HTTP URL调用,如果响应时间过长则会超时。 目前它正在返回简单的JSON字符串.. 我当前的要求是10 ms 。 在10 ms它应该能够从服务器获取数据。 我猜它是可能的,因为它只是对同一数据中心内的服务器的HTTP调用。 我的客户端程序和实际服务器在同一个数据中心内,并且它们之间的ping时间延迟为0.5 ms ,所以它应该是可行的。 我正在使用RestTemplate进行URL调用。 下面是我为我编写的使用ExecutorService和Callables – public class URLTest { private ExecutorService executor = Executors.newFixedThreadPool(10); public String getData() { Future future = executor.submit(new Task()); String response = null; try { System.out.println(“Started..”); response = future.get(100, TimeUnit.MILLISECONDS); System.out.println(“Finished!”); } catch (TimeoutException e) { System.out.println(“Terminated!”); } catch (InterruptedException […]

Android线程/处理程序错误IllegalStateException:尚未发布指定的消息队列同步障碍标记

我想做什么 使用处理程序和后台线程每3秒更新一次UI线程上的TextView x 10次。 UI上的输出应该是“重复:1”开始,每3秒开始,它应该是++的数字。 例如,“重复:1”在3秒后更新为“重复:2”,然后在3秒后更新为“重复:3”。 我是如何尝试这样做的 我测试的第一个方法是使用带有Thread.sleep()的for循环来为每个循环引起第二个延迟。 在每个循环中,我调用sendMessage(message)方法,我的理论是每次都会调用UI Thread上的handleMessage()方法。 这是代码: public class MainActivity extends AppCompatActivity { private static final String TAG = “MainActivity”; private TextView repeat; private Handler mHandler; private Thread backgroundThread; private String uiString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, “onCreate(Bundle) called by Gil “); repeat = (TextView)findViewById(R.id.view_repeat); runInBackground(); backgroundThread.start(); […]

为什么Thread.stop不能在Thread.interrupt不起作用的情况下工作?

官方 太阳 Thread.stop()上的Oracle立场是不应该使用它。 在其他论点中, 他们写道 : 应该注意的是,在等待线程不响应Thread.interrupt的所有情况下,它也不会响应Thread.stop。 但我不明白。 如果一个线程正在忙于处理某些事情(不只是在外部资源上等待或阻塞)并且没有明确地检查中断标志,那么当Thread.stop()仍然有效时, Thread.interrupt()不会做任何事情(抛出ThreadDeath )?

Hazelcast可防止JVM终止

我们在遗留Java集群应用程序中使用Hazelcast 2.6.2。 当应用程序停止时,JVM不再终止。 它似乎是由Hazelcast线程没有被标记的守护进程引起的。 我没有找到通过Hazelcast API来标记它们守护进程的方法。 是否有推荐的解决方案来阻止Hazelcast阻止JVM终止? 问候

为什么我的线程没有醒来? (JAVA)

我正在松散地关注Java NIO的教程,以创建我的第一个multithreading,网络Java应用程序。 本教程基本上是关于创建一个echo-server和一个客户端,但目前我只是试图获取服务器从客户端接收消息并将它们记录到控制台。 通过在教程页面中搜索“EchoServer”,您可以看到我基于大多数相关代码的类。 我的问题是(至少我认为是)我找不到初始化要处理的消息队列的方法,以便可以按我的意愿使用它。 应用程序在两个线程上运行:服务器线程,用于侦听连接和套接字数据;以及工作线程,用于处理服务器线程接收的数据。 当服务器线程收到消息时,它会调用worker上的processData(byte[] data) ,并将数据添加到队列中: 1. public void processData(byte[] data) { 2. synchronized(queue) { 3. queue.add(new String(data)); 4. queue.notify(); 5. } 6. } 在worker thread的run()方法中,我有以下代码: 7. while (true) { 8. String msg; 9. 10. synchronized (queue) { 11. while (queue.isEmpty()) { 12. try { 13. queue.wait(); 14. } catch (InterruptedException e) […]

如何在底层连接有状态时使用Apache HttpClient?

我已经搜索了很多关于如何在multithreading中使用HttpClient的信息。 他们中的大多数建议使用ThreadSafeClientConnManager。 但我的应用程序必须登录一些主机(登录表单页面),以便HttpClient获得基础的有状态连接。 如果multithreading,ThreadSafeClientConnManager可以保持登录状态吗?

SwingWorker,未调用done()方法

这只是SwingWorker的一个实现: class GuiWorker extends SwingWorker { private JFrame frame = new JFrame(); private JDialog dialog = new JDialog(frame, “Loadin data”, true); private JProgressBar progressBar = new JProgressBar(); private Statistics st = new Statistics(); public GuiWorker(GraphEditor editor, Statistics st) { this.st = st; Window mainWindow = SwingUtilities.windowForComponent(editor .getGraphComponent().getParent()); dialog.setSize(400, 200); int x = mainWindow.getX() + (mainWindow.getWidth() […]

为什么LogWriter中的竞争条件会导致生产者阻塞?

首先要防止标记问题由不喜欢读到最后的人重复我已经阅读了生产者 – 消费者日志服务,并且关闭问题的方式不可靠 。 但它没有完全回答问题和答案与书中的文字相矛盾。 在书中提供以下代码: public class LogWriter { private final BlockingQueue queue; private final LoggerThread logger; private static final int CAPACITY = 1000; public LogWriter(Writer writer) { this.queue = new LinkedBlockingQueue(CAPACITY); this.logger = new LoggerThread(writer); } public void start() { logger.start(); } public void log(String msg) throws InterruptedException { queue.put(msg); } private class […]

ScheduledExecutorService只循环一次

我正在尝试实现一个每秒循环的ScheduledExecutorService线程,但截至目前它只循环一次。 我的问题是如何设置它以便它周期性地循环而不是一次迭代? 另外,如何将连接池传递给线程,以便每次迭代都可以查询数据库? 任何帮助深表感谢。 public static void main(String[] args) throws InterruptedException { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { AdminManager frame = new AdminManager(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); BoneCP connectionPool = null; Connection connection = null; try { // load the database driver (make sure this […]

同步以确保另一个线程将看到对不可变对象的引用

我正在研究这个,以了解新JMM中最终字段的行为(5以后)。 这个概念很清楚:在正确构造对象之后,保证初始化的最终字段对所有线程的可见性。 但是在本节的最后,我读到了这个,这让我感到困惑: 现在,说完所有这些,如果在一个线程构造一个不可变对象(即一个只包含最终字段的对象)之后,你想确保所有其他线程都能正确看到它,你通常还需要使用同步。 例如,没有其他方法可以确保第二个线程可以看到对不可变对象的引用。 这是否意味着虽然单个最终字段(组成不可变对象)没有同步(例如,此处可见性)问题。 但是,在线程中首次创建的不可变对象本身在其他线程中可能不可见(正确创建)? 如果是这样,虽然我们可以跨线程共享初始化的不可变对象而没有任何线程不安全的担忧,但在创建时,他们需要“特别关注”线程安全,就像其他可变项一样?