-
怎么优化线程的run方法0
该线程占用cpu时间长,并且占用内存多。run方法哪地方需要优化,请大侠们指教,坐等回答... 下面是线程的run方法,该方法的作用是检查数据库中有没有未处理的事件,如果有,就处理。 while条件一直是true commonService.basicQuery()方法是来查询数据库 catch中的doPauseThread()方法是让该线程睡5秒 public void run() { String err = "Error occurred in FlightEventThread, Administrated"; while (isThreadAlive) { try { List<FlightEvent> allEvent = commonService.basicQuery( FlightEvent.class, (Object) exampleEvent, true, "eventId"); for (FlightEvent event : allEvent) { event.setIsProcessed("P"); commonService.basicUpdate(event); IEventProcessor eventProcessor = (IEventProcessor) Global.applicationContext .getBean(event.getEventProcess().getProcessBean()); eventProcessor.setEvent(event); try { eventProcessor.execute(); eventProcessor.doSendMessageToFront(); } catch (IllegalDataException ie) { log.error(err, ie); } catch (Exception e) { log.error(err, e); } } /* Sleep is not needed disable by hwlcsx */ /*doPauseThread();*/ } catch (Exception e) { log.error(err, e); doPauseThread(); } } }
2012年12月21日 15:32
10个答案 按时间排序 按投票排序
-
List<FlightEvent> allEvent
IEventProcessor eventProcessor这些不用每次都建立新的对象吧,反正你是死循环,申明对象写到while外面稍微好一点吧。本人拙见2012年12月29日 17:23
-
楼主的问题问的不太清楚啊。
1.占用cpu时间长。
是cpu占用率高?
你用while(true)一直死循环的话,一个CPU会长时间处于100%状态吧?
你可以把那个doPauseThread();移到异常处理外面来,即每次循环后都让
线程sleep5秒(如果对实时性要求不高,可以sleep更久一点),这样cpu占用率会下降。
另外在线程协调调度方面,其实并不推荐这种死循环去判断标志位的设计,
虽然这种设计最容易实现。
你可以使用wait()和notify()方法来协调线程调度,
即这个方法的循环里处理完事件后调用wait()等待,另一个线程更新事件后
调用notify()唤醒该线程去处理。
2.占用内存多
你这些接口干了什么我也不知道,所以就看不出来哪里会占用内存多了,
还有占用多是个什么概念?会导致内存不够?还是通过其他工具看到该线程
占用的内存很多?2012年12月24日 11:05
-
你catch exception才会暂停线程,不然就一直循环去取事件?那不占CPU才怪呢,抛去数据库IO的时间,其他时间这个线程全部是运算
2012年12月21日 17:30
-
ObcsEvent 表的数据会越来越多,查询就会越来越慢;
可以考虑把已经处理的数据移到另一个表ObcsEventHis,然后从ObcsEvent删除。
ObcsEvent表都是未处理的,分表的策略2012年12月21日 16:07
-
感觉update比较费时间,能否改成批量更新?
commonService.basicUpdate(event);
改成:
commonService.batchUpdate(allEvent);2012年12月21日 15:57
相关推荐
线程中start方法和run方法的区别
在Java多线程编程中,`Thread` 类的 `run()` 方法和 `start()` 方法扮演着不同的角色,它们之间的区别是理解并发执行的关键。 首先,`start()` 方法是真正启动新线程的方法。当你调用 `Thread` 对象的 `start()` ...
当创建一个Thread的子类并重写`run()`方法时,`run()`方法内部的代码定义了线程的行为。在`main`方法中创建子类实例并调用`start()`方法启动线程。例如: ```java public class MyThread extends Thread { @...
`start()`方法不会立即执行`run()`方法,而是将它放入线程的执行队列中,等待JVM调度执行。由于线程的并发性,两个线程可能会交错执行,因此输出结果可能会有不同顺序,但最终加法的结果总和应该为5050。 在多线程...
通常,我们通过创建Thread对象并重写其`run()`方法来启动一个线程。然而,`run()`方法默认是没有返回值的,即它返回的是`void`类型。这可能在某些场景下无法满足需求,比如当我们需要知道线程执行的结果时。为了解决...
run()方法是线程执行的主要逻辑,当调用QThread的start()方法时,系统会调用这个方法。例如: ```cpp class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr) : ...
本篇将深入探讨如何通过继承`QThread`并重写`run()`函数来创建线程,以及在Windows 10环境下使用mingW32编译运行。 首先,让我们理解`QThread`的基本概念。`QThread`是一个跨平台的线程类,它提供了事件驱动的线程...
使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。 典型的问题: QObject: ...
`run()`和`start()`是创建和启动线程的核心方法。`run()`包含需要并行执行的代码,`start()`启动线程,由Java内存模型自动调用`run()`。`run()`必须声明为`public`,且返回类型为`void`。 在上述示例中,`...
在Java编程中,多线程是并发执行代码的重要机制,...在实际编程中,合理地使用`run()`、`yield()`、`sleep()`等方法,结合同步机制如`synchronized`关键字和`wait() notify()`等,可以有效控制线程行为,优化系统性能。
只有调用了 `start()` 方法,线程才会开始执行 `run()` 方法中定义的代码。例如,在 `MethodTest` 类的 `main` 方法中,`frist.start()` 和 `second.start()` 分别启动了 `FristThread` 和 `SecondThread`,使得它们...
`start()`方法用于启动线程,它会调用`run()`方法,但与直接调用`run()`不同,`start()`会使得线程进入就绪状态,等待JVM分配CPU资源执行。直接调用`run()`方法只会将其作为普通方法执行,不会实现线程的并发。 3. ...
这将导致调用该线程的`run()`方法。 - **2.2 线程执行**: 实际上执行的是`run()`方法中的代码。这是一个虚函数,必须在子类中重新实现。 - **2.3 线程退出**: 可以通过调用`exit()`或`terminate()`来终止线程。`exit...
- **start()和run()**:`start()`方法用于启动线程并执行`run()`方法中的代码。直接调用`run()`方法则不会创建新线程,而是同步执行。 - **join()**:使当前线程等待特定线程完成执行。 - **interrupt()**:中断...
创建一个新的线程通常会定义一个实现Runnable接口的类,并重写`run()`方法,该方法包含线程执行的逻辑。 2. **线程的启动** 创建了Runnable对象后,需要通过Thread类的构造函数将其传递给新线程,并调用`start()`...
3. **线程运行**:在`run()`方法中,`while (flag)`循环将持续运行,直到`flag`被设置为`false`。 4. **停止线程**:`public void stop()`方法中,将`flag`设置回`false`,从而使得`while`循环退出,线程停止运行。 ...
使用Task.Run方法可以轻松地将工作推送到后台线程: ```csharp Task task = Task.Run(() => YourAsyncWork()); await task; ``` 这里的`YourAsyncWork`方法会在单独的线程上运行,而主线程可以继续执行其他任务。 ...
然后,在这个子类中,你需要覆盖`run()`方法,将线程执行的任务放入`run()`方法中。例如: ```java public class MyThread extends Thread { public void run() { // 线程执行的代码 } } ``` 在`main`方法中...
当调用`start()`方法时,系统会自动调用`run()`方法,在新的线程中执行。例如: ```java public class MyThread extends Thread { @Override public void run() { // 在这里编写线程要执行的代码 } } ...
在Java中,线程的创建和管理涉及几个关键方法以及一个关键字:`run()`, `start()`, `wait()`, `notify()`, `notifyAll()`, `sleep()`, `yield()`, `join()` 和 `synchronized`。以下是对这些方法和关键字的详细说明...