Tag: multithreading

内存不一致与线程交错有何不同?

我正在编写一个multithreading程序,正在研究是否应该使用volatile作为我的布尔标志。 关于并发性的文档oracle跟踪并没有解释除了以下内容之外的任何memory consistency errors : 当不同的线程具有应该是相同数据的不一致视图时,会发生内存一致性错误。 假设这些不一致的视图仅在“写入”操作之后发生是有意义的。 但是多久之后呢? 例1 Thread A: Retrieve flag. Thread B: Retrieve flag. Thread A: Negate retrieved value; result is true. Thread A: Store result in flag; flag is now true. Thread B: System.out.print(flag) –> false 由于Thread A和Thread B同时运行,因此打印也可以为true,具体取决于何时检索flag 。 对于不一致而言,这是完全合理的。 但是描述memory consistency errors的方式(写入变量不一定反映在其他线程中)听起来这也是如此: 例2 Thread A: Retrieve flag. Thread A: […]

如何创建一个等待布尔变量变为true的线程?

我有一个函数需要在布尔变量为真时调用。 我尝试在线程中使用while循环,但它不起作用。 这是我尝试过的: public class MyRunnable implements Runnable { public void run() { while (true) { if (conditions == true) { System.out.println(“second”); break; } } } public static void main(String args[]) { boolean condition = false; (new Thread(new MyRunnable())).start(); System.out.println(“first\n”); // set conndition to true condition = true; } } 结果应该是: first second

如何在Java中进行multithreading处理

我必须multithreading一个运行1000批次代码的方法。 我需要将这些批次分配给不同的线程。 目前我已经产生了3个线程,但是所有3个线程都在挑选第一批1000个线程。 我希望其他批次不应该选择相同的批次而是选择另一批次。 请帮忙并提出建议。

SQL更新语句的Java单工作线程

我正在研究一个基于Java的服务器,我将在其中拥有多个线程(每个连接用户一个线程+一些额外的线程)。 将涉及一些数据库连接,所以我想每次服务器对数据库进行SELECT查询时,它将为此启动一个新线程,以防止阻塞当前线程。 我打算为此使用连接池,我想我知道如何做到这一点。 (我已经研究过C3P0 )但是,也会涉及很多UPDATE语句,但是这些语句直接运行并不重要,这里有延迟。 因为可能有很多UPDATE语句,所以我想为所有UPDATE语句设置一个工作线程。 在我看来,这将具有能够重用PreparedStatement -objects的优势 问题:我如何从其他线程告诉UPDATE -worker线程运行一些语句? 我知道multithreading以及如何使用synchronized块让线程彼此“交谈”,但是随着涉及的数据库,它突然感觉更复杂。 我已经读过不应该在线程之间共享准备好的语句和连接。 我现在就如何解决它的想法:(感觉不是一个好的解决方案) 使用自定义类的LinkedBlockingQueue (或其他类型的Queue),其中包含要调用哪种UPDATE语句以及要将其发送到哪些参数的信息。 然后工作线程将在通知时从该队列中读取(当将某些内容添加到队列时),并且它将运行适当的方法,该方法将使用相应的预准备语句,设置参数并调用它。 编辑:一个不好的想法,我认为自己采用这种方法是params可能是int,String,double或者其他什么。 如何将它们存储在自定义类中? 将它们全部存储为String感觉不太好。 我是在正确的轨道上还是有更好的方法来解决这个问题?

使用multithreading处理对java数组进行分区和分析

我必须通过for循环初始化一个浮点[12000] 12000次。 然后我扫描数组以查找超过特定阈值的值。 如果值超过阈值,我操纵某个对象的实例变量。 例: Random random = new Random(); float[] x = new float[12000]; for (int i = 0; i < x.length; i++) { x[i] = random.nextFloat(); } for (int i = 0; i = 0.75) { \\ do something interesting } } 基本上,我必须更改数组的值,并在每次长度为12000时在新数组上执行12000次。“有趣的”代码只是在另一个数据结构中查找该索引并调用setter。 根据我的系统时间计算,我需要大约13个小时。 我的机器上有8个处理器。 我如何利用java的multithreadingfunction? 我特意寻找分区初始化和扫描数组的线程解决方案。 使用线程的源代码将不胜感激。

异步更新vaadin组件

我有这个代码每隔3秒更新一次vaadin按钮的标题。 TimerTask tt = new TimerTask() { @Override public void run() { try { logger.debug(“adding l to button’s caption”); btn.setCaption(eventsButton.getCaption() + “l”); } catch (Exception ex) { logger.error(ex.getMessage()); } } }; Timer t = new Timer(true); t.scheduleAtFixedRate(tt, 0, 3000); 但是,它不能更改按钮的标题,尽管它每3秒执行一次(由日志文件判断)。 如何从另一个线程访问vaadin的GUI组件?

setContextClassLoader含义

我正在尝试清理由于创建自己的线程而导致内存泄漏的Tomcat警告。 http://wiki.apache.org/tomcat/MemoryLeakProtection建议我在启动线程之前调用myThread.setContextClassLoader(null) 。 这次电话的含义是什么? run()方法中的代码是否仍然能够从我的应用程序中解析类?

有没有人看到这个线程模式有任何问题?

这是一个简单的线程模式,我在编写一个只需要一个线程的类时使用,并且需要一个特定的任务。 这类的通常要求是它应该是可启动的,可停止的和可重启的。 有没有人看到我使用这种模式的任何问题? public class MyThread implements Runnable { private boolean _exit = false; private Thread _thread = null; public void start () { _exit = false; if (_thread == null) { _thread = new Thread(this, “MyThread”); _thread.start(); } } public void run () { while (!_exit) { //do something } } public void stop […]

我可以使用Timer对象使程序饱和吗?

我有一个程序,我计划使用很多Timer对象,据我所知,每个Timer都运行在它自己的线程上。 所以我想知道是否有可能启动这么多的计时器,它会伤害程序的性能太multithreading。 例如,我想有几个(布尔,计时器)对可以在几个不同的时间间隔反转布尔值。

如何知道哪个线程首先从两个线程中完成执行

我有两个线程A和B.如果A先完成,那么我必须执行function1 else如果B先完成,我需要执行函数2.我知道这两个线程中哪一个先完成执行?