0 0

怎么优化线程的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个答案 按时间排序 按投票排序

0 0

List<FlightEvent> allEvent
IEventProcessor eventProcessor这些不用每次都建立新的对象吧,反正你是死循环,申明对象写到while外面稍微好一点吧。本人拙见

2012年12月29日 17:23
0 0

去把hwlcsx抓来问问为什么sleep is not needed

2012年12月24日 21:05
0 0

楼主的问题问的不太清楚啊。
1.占用cpu时间长。
是cpu占用率高?
你用while(true)一直死循环的话,一个CPU会长时间处于100%状态吧?

你可以把那个doPauseThread();移到异常处理外面来,即每次循环后都让
线程sleep5秒(如果对实时性要求不高,可以sleep更久一点),这样cpu占用率会下降。

另外在线程协调调度方面,其实并不推荐这种死循环去判断标志位的设计,
虽然这种设计最容易实现。
你可以使用wait()和notify()方法来协调线程调度,
即这个方法的循环里处理完事件后调用wait()等待,另一个线程更新事件后
调用notify()唤醒该线程去处理。

2.占用内存多
你这些接口干了什么我也不知道,所以就看不出来哪里会占用内存多了,
还有占用多是个什么概念?会导致内存不够?还是通过其他工具看到该线程
占用的内存很多?

2012年12月24日 11:05
0 0

   你可以用定时任务quarzy来做。例如5分钟做一个查询,

2012年12月23日 16:59
0 0

1.降低轮询的频率
2.不采用轮询。在新增,修改事件的时候触发事件处理器。

2012年12月22日 17:22
0 0

为什么不新启线程去做数据库更新的事情呢,让主线程只干单一的事情

2012年12月21日 21:25
0 0

你catch exception才会暂停线程,不然就一直循环去取事件?那不占CPU才怪呢,抛去数据库IO的时间,其他时间这个线程全部是运算

2012年12月21日 17:30
0 0

ObcsEvent 表的数据会越来越多,查询就会越来越慢;
可以考虑把已经处理的数据移到另一个表ObcsEventHis,然后从ObcsEvent删除。
ObcsEvent表都是未处理的,分表的策略

2012年12月21日 16:07
0 0

感觉update比较费时间,能否改成批量更新?
commonService.basicUpdate(event);
改成:
commonService.batchUpdate(allEvent);  

2012年12月21日 15:57
0 0

你这个方法的性能瓶颈是在查询数据库吧,优化sql和数据库吧

2012年12月21日 15:38

相关推荐

    线程中start方法和run方法的区别

    线程中start方法和run方法的区别

    Java多线程——Thread类中run()方法和start()方法的区别.docx

    在Java多线程编程中,`Thread` 类的 `run()` 方法和 `start()` 方法扮演着不同的角色,它们之间的区别是理解并发执行的关键。 首先,`start()` 方法是真正启动新线程的方法。当你调用 `Thread` 对象的 `start()` ...

    线程及方法调用

    当创建一个Thread的子类并重写`run()`方法时,`run()`方法内部的代码定义了线程的行为。在`main`方法中创建子类实例并调用`start()`方法启动线程。例如: ```java public class MyThread extends Thread { @...

    java的thread类重写run方法的双线程从1加到100

    `start()`方法不会立即执行`run()`方法,而是将它放入线程的执行队列中,等待JVM调度执行。由于线程的并发性,两个线程可能会交错执行,因此输出结果可能会有不同顺序,但最终加法的结果总和应该为5050。 在多线程...

    java线程的run()没有返回值怎么办?

    通常,我们通过创建Thread对象并重写其`run()`方法来启动一个线程。然而,`run()`方法默认是没有返回值的,即它返回的是`void`类型。这可能在某些场景下无法满足需求,比如当我们需要知道线程执行的结果时。为了解决...

    QT多线程的实现方式:QThread run优雅的创建与退出QT多线程

    run()方法是线程执行的主要逻辑,当调用QThread的start()方法时,系统会调用这个方法。例如: ```cpp class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr) : ...

    Qt之线程的使用(继承QThread重写run函数) 源码

    本篇将深入探讨如何通过继承`QThread`并重写`run()`函数来创建线程,以及在Windows 10环境下使用mingW32编译运行。 首先,让我们理解`QThread`的基本概念。`QThread`是一个跨平台的线程类,它提供了事件驱动的线程...

    QSerialport多线程方法

    使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。 典型的问题: QObject: ...

    JAVA多线程操作方法实用大全

    `run()`和`start()`是创建和启动线程的核心方法。`run()`包含需要并行执行的代码,`start()`启动线程,由Java内存模型自动调用`run()`。`run()`必须声明为`public`,且返回类型为`void`。 在上述示例中,`...

    【独家】【笔面试知识要点】18.多线程run与yielding1

    在Java编程中,多线程是并发执行代码的重要机制,...在实际编程中,合理地使用`run()`、`yield()`、`sleep()`等方法,结合同步机制如`synchronized`关键字和`wait() notify()`等,可以有效控制线程行为,优化系统性能。

    多线程控制方法

    只有调用了 `start()` 方法,线程才会开始执行 `run()` 方法中定义的代码。例如,在 `MethodTest` 类的 `main` 方法中,`frist.start()` 和 `second.start()` 分别启动了 `FristThread` 和 `SecondThread`,使得它们...

    线程的几个重要方法.doc

    `start()`方法用于启动线程,它会调用`run()`方法,但与直接调用`run()`不同,`start()`会使得线程进入就绪状态,等待JVM分配CPU资源执行。直接调用`run()`方法只会将其作为普通方法执行,不会实现线程的并发。 3. ...

    QT线程start()和run()

    这将导致调用该线程的`run()`方法。 - **2.2 线程执行**: 实际上执行的是`run()`方法中的代码。这是一个虚函数,必须在子类中重新实现。 - **2.3 线程退出**: 可以通过调用`exit()`或`terminate()`来终止线程。`exit...

    设计滚动字演示线程状态及改变方法

    - **start()和run()**:`start()`方法用于启动线程并执行`run()`方法中的代码。直接调用`run()`方法则不会创建新线程,而是同步执行。 - **join()**:使当前线程等待特定线程完成执行。 - **interrupt()**:中断...

    java项目史上最简单的多线程使用方法(demo)

    创建一个新的线程通常会定义一个实现Runnable接口的类,并重写`run()`方法,该方法包含线程执行的逻辑。 2. **线程的启动** 创建了Runnable对象后,需要通过Thread类的构造函数将其传递给新线程,并调用`start()`...

    JAVA线程停止的方法

    3. **线程运行**:在`run()`方法中,`while (flag)`循环将持续运行,直到`flag`被设置为`false`。 4. **停止线程**:`public void stop()`方法中,将`flag`设置回`false`,从而使得`while`循环退出,线程停止运行。 ...

    C#多线程执行

    使用Task.Run方法可以轻松地将工作推送到后台线程: ```csharp Task task = Task.Run(() =&gt; YourAsyncWork()); await task; ``` 这里的`YourAsyncWork`方法会在单独的线程上运行,而主线程可以继续执行其他任务。 ...

    在Java中创建线程有两种方法

    然后,在这个子类中,你需要覆盖`run()`方法,将线程执行的任务放入`run()`方法中。例如: ```java public class MyThread extends Thread { public void run() { // 线程执行的代码 } } ``` 在`main`方法中...

    android线程启动方法源代码

    当调用`start()`方法时,系统会自动调用`run()`方法,在新的线程中执行。例如: ```java public class MyThread extends Thread { @Override public void run() { // 在这里编写线程要执行的代码 } } ...

    Java 线程常用方法总结

    在Java中,线程的创建和管理涉及几个关键方法以及一个关键字:`run()`, `start()`, `wait()`, `notify()`, `notifyAll()`, `sleep()`, `yield()`, `join()` 和 `synchronized`。以下是对这些方法和关键字的详细说明...

Global site tag (gtag.js) - Google Analytics