Re: [问题] Thread 都在 Wait,你会怎么做?

楼主: lin1987www (林奕忠)   2014-05-22 16:05:04
: 当你使用Executor (或说Thread Pool)
: 你的每个Task本质上就不应该这样设计
: 不应该会有任何动作是会Block太久
: 甚至最好都是non-blocking的方法,
: 但是我没有那么极端,
: 只要不要是呼叫wait或是sleep这种就好
: 可以接受预期时间会回来的IO或是synchronized block或method
: 以你的case
: 我假设你的程式大概长这样
: public class WorkingTask extends xxTask {
: public void run() {
: if(!isEngineStarted()) {
: executors.execute(new StartEngineTask());
: waitForEngineStart();
: }
: startWorking();
: }
: }
: 但这种会等,而且不会有预期开始的动作,
: 在Task里面就是一种类似"占著茅坑不拉屎"的感觉
: 比较简单的改法应该是这样
: public class WorkingTask extends xxTask {
: public void run() {
: if(!isEngineStarted()) {
: if(!isEngineStarting()) {
: scheduledExecutors.execute(new StartEngineTask());
: }
: scheduledExecutors.schedule(new WorkingTask(),
: 1, TimeUnit.SECONDS); // postpone current task 1 second
: return;
: }
: startWorking();
: }
: }
: 这种做法就是你的task永远都不会占住
: 而发现没开的话,就async打开
: 并且每一秒钟去看一下是否engine打开并且往下做..
: 还有不知道你的这些"员工"数量会很多吗?
: 如果真的没有很多的话,
: 而且每个Task会要跑很久的话
: 甚至是要跑道某个人叫停才会停的task的话
: ThreadPool这种方法不太适合你..
: 就每个task开一个thread比较适合
将自己重新加入排程相当不错,至少我没想过能这样用 XD
但是我有用到Future的,根据你的思考模式,当要开工前,就预判能不能开工
如果没打开电源的话,就不要在机台前面等 XD 这样就不是占用 Thread
范例网址:
http://ideone.com/7wG3J7
可惜的是我用到的Future特性,将一连串动作串起来
如果重新加入Executor的话,我没办法把
先前加入的Future串起来 Orz
再者我思考了我的设计,有重大的缺失,
像打开电源这么重要的任务,应该要有新的Thread或者专用的Thread,
这样做应该会比较妥当。
感谢大大让我脑力激荡
作者: lovdkkkk (dk)   2014-05-22 17:12:00
应该先开电再开工就好了? gist: http://ppt.cc/rOuP
楼主: lin1987www (林奕忠)   2014-05-22 17:22:00
以补充描述在原贴文中了,可惜不能这样 xd
作者: bestlong (bestlong)   2014-05-22 17:23:00
我也认为第一个上工要先开电,自己的机台自己开关电

Links booklink

Contact Us: admin [ a t ] ucptt.com