看java多线程和定时器,有些疑惑,望朋友们指教,谢谢。

joinsearch 2007-12-17 11:51:24
1.如果想同时产生多个请求,定时器是否可以实现呢?比如模拟客户向数据库发送大量请求。还是说用多线程实现。
2.产生多个线程,是否表示每个线程是一个请求?
3.定时器定时执行一个任务,比如每隔几毫秒执行一个大任务,是否可以表示多客户端的请求?这些任务是并发执行的呢还是顺序执行的?应该是一个一个顺序执行的吧,但是如果每个任务需要很长时间,那么后面的任务是否能够在定时器间隔时间后按时执行呢?
4.定时器定时执行任务时,是新建了一个线程执行新任务,还是用原来的老线程继续执行新任务呢?
...全文
2238 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiuZhongdong27 2012-05-10
  • 打赏
  • 举报
回复
这个算 多个线程么
LiuZhongdong27 2012-05-10
  • 打赏
  • 举报
回复
受到了不少启发
我是直接这么写的 这个该怎么解释
public static void main(String[] args) {
TestTimer t = new TestTimer();
t.qunfa();
t.qunfa2();

}

public void qunfa() {
Timer timer = new Timer();
TimerTask task = new TestTimerTask();
timer.schedule(task, 100L, 10*1000L);
}

public void qunfa2(){
Timer timer = new Timer();
TimerTask task = new TestTimerTask2();
timer.schedule(task, 100L, 1*1000L);
}
insert_viann 2010-12-01
  • 打赏
  • 举报
回复
精彩 精彩
joinsearch 2007-12-29
  • 打赏
  • 举报
回复
各位讲得都不错,谢谢!
qingyuan18 2007-12-25
  • 打赏
  • 举报
回复
1.如果想同时产生多个请求,定时器是否可以实现呢?比如模拟客户向数据库发送大量请求。还是说用多线程实现。
程序中for(int i=0;i<N;i++)
{
Thread thread = new Thread();
}
这样产生多个线程的操作已经可以模拟同时发送多个请求了,因为For循环的时间基本上是忽略不计的,用定时器当然也可以,但是个人感觉没有必要了

2.产生多个线程,是否表示每个线程是一个请求?
当然每个线程是一个请求

3.定时器定时执行一个任务,比如每隔几毫秒执行一个大任务,是否可以表示多客户端的请求?这些任务是并发执行的呢还是顺序执行的?应该是一个一个顺序执行的吧,但是如果每个任务需要很长时间,那么后面的任务是否能够在定时器间隔时间后按时执行呢?
在问题1中已进行了描述,For循环开多线程的时间完全可以认为这些线程是同时执行的

4.定时器定时执行任务时,是新建了一个线程执行新任务,还是用原来的老线程继续执行新任务呢?
根据你的描述,肯定应该新建新的线程执行请求,为什么要用原来的线程呢?如果需要线程调度的话,JDK5的线程池API已经足够我们用了:
public class MyTimerTaskThread extends TimerTask
{

@Override
public void run() {
// your thread method

}

}

public static void main(String[] args) throws IOException
{
Timer timer = new Timer();
timer.schedule(new MyTimerTaskThread(),100);
}
wuxiao_v 2007-12-25
  • 打赏
  • 举报
回复
不过16楼的代码可以解决你的问题.
wuxiao_v 2007-12-25
  • 打赏
  • 举报
回复
随便看看Timer和TimerTask及TimerThread的源码(都在%JDK%\src.zip里)
你会发现Timer.java里有一个TimerThread类,就很容易搞明白了

我已经看了Timer.java里有一个TimerThread类,这样说你的说法应该是正确的? wuxiao_v 可能有错误吧!

Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器
new Timer(int x, xxlistner lis)
就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的
,但是不管怎么定义他都是运行在一个新的线程上的.

应该不会随随便便就启动新线程的吧 ?



//确实是我错了,Timer启动的流程是运行在Timer内部固有的那个线程上的,API有时候说的不够详细,研究src确实是一种好方法.
wuxiao_v 2007-12-25
  • 打赏
  • 举报
回复
public class Twork implements Actionlistner{
//这个类是监听器他的作用是受到Timer的激发,然后执行actionPerformed中的方法

Twork(){}


public void actionPerformed(ActionEvent e){
Userwork uk=new Userwork();
uk.start;
}


}

public class Userwork extends Thread{
//这个类就是你传说中的客户线程
public run(){
//你的业务流程
//这个方法是 Thread的固有方法,这个方法的内容会在一个新的线程里执行
}

}




public class TestMain(){
//这个类是程序的入口

public static void main(String args[]){

Twork tw= new Twork();
Timer tm= new Timer (1000,tw);
tm.start;

}


}




//不知道这么写你还明白不,如果还不明白加我QQ53737652
wuxiao_v 2007-12-25
  • 打赏
  • 举报
回复
哎,你还是没明白我告诉你的是什么意思.

xxlistner 是监听器对吧,他每隔X秒就会受到Timer的激发,从而驱动一个流程.

你的测试线程包含在这个流程里.

joinsearch 2007-12-21
  • 打赏
  • 举报
回复
to redduke1202,

随便看看Timer和TimerTask及TimerThread的源码(都在%JDK%\src.zip里)
你会发现Timer.java里有一个TimerThread类,就很容易搞明白了

我已经看了Timer.java里有一个TimerThread类,这样说你的说法应该是正确的? wuxiao_v 可能有错误吧!

Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器
new Timer(int x, xxlistner lis)
就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的
,但是不管怎么定义他都是运行在一个新的线程上的.

应该不会随随便便就启动新线程的吧 ?
「已注销」 2007-12-21
  • 打赏
  • 举报
回复
多看少说
各位先去看看jdk下带的Timer及TimerTask的源码
不要误导人
wuxiao_v 2007-12-21
  • 打赏
  • 举报
回复
我知道你的疑惑了

如果你想模拟多用户并发可以这么做
..............................
public class Twork implements Actionlistner{

Twork(){}


public void actionPerformed(){
//在这个方法中写你的业务逻辑,(业务逻辑中包括启动一个新的线程)
}


}

Twork tw= new Twork();
Timer tm= new Timer (1000,tw);
tm.start;
...................
这样就可以每1秒钟启动一个你需要的处理业务逻辑的流程(在一个新的线程上).


Timer中有一个固有的线程,这个线程的作用是启动新的线程(对于你的程序来说)
wuxiao_v 2007-12-21
  • 打赏
  • 举报
回复
这是redduke1202给予的回复:

等 级:
发表于:2007-12-17 11:51:441楼 得分:0
1.定时器本身内置一个线程来管理和执行任务,如果你在任务里额外启动线程,每个线程里分别发送一个请求的话,可以实现
2.要看每个请求是否属于这个线程,如果只有一个连接,多个线程,似乎结果还是一个连接
3.同一个定时器内的任务是一个接一个执行的,如果前面一个任务执行时间长,则会影响到后面的任务,假设一个任务里写一个死循环,那么后面的任务永远也执行不到
排除死循环,定时器有一个休正时间的任务执行方式,添加任务到定时器的时候使用 scheduleAtFixedRate 方法就可以了
4.见1,每个Timer内置一个线程,除非你的任务代码里另外开线程,否则只有那一个线程


和wuxiao_v: 说的不一样啊。


到底是怎么个详细情况呢?你们俩谁的说法合理一些?
----------------------------------
这不和我说的一样么
wuxiao_v 2007-12-21
  • 打赏
  • 举报
回复
先不做解释你先来做一个简单的实验:
1,写一个GUI界面上边有两个textfiled tf1和tf2,两个button btn1,btn2;

2,然后再用两个Timer类作两套服武器分别再两个tf上显示 i的值 ,i+=10,(btn启动用);

你会发现两个tf上都的数字都会不断变化,而且激活后两个btn都处于可用状态(非假死状态).

然后你在作另外一个试验

1,同样的GUI和服务,只是不用Timer控制而是用循环控制数字的变化,你看看你按了一个btn之后还有没有机会按第二个.
joinsearch 2007-12-19
  • 打赏
  • 举报
回复
这是redduke1202给予的回复:

等 级:
发表于:2007-12-17 11:51:441楼 得分:0
1.定时器本身内置一个线程来管理和执行任务,如果你在任务里额外启动线程,每个线程里分别发送一个请求的话,可以实现
2.要看每个请求是否属于这个线程,如果只有一个连接,多个线程,似乎结果还是一个连接
3.同一个定时器内的任务是一个接一个执行的,如果前面一个任务执行时间长,则会影响到后面的任务,假设一个任务里写一个死循环,那么后面的任务永远也执行不到
排除死循环,定时器有一个休正时间的任务执行方式,添加任务到定时器的时候使用 scheduleAtFixedRate 方法就可以了
4.见1,每个Timer内置一个线程,除非你的任务代码里另外开线程,否则只有那一个线程


和wuxiao_v: 说的不一样啊。


到底是怎么个详细情况呢?你们俩谁的说法合理一些?
joinsearch 2007-12-19
  • 打赏
  • 举报
回复
回wuxiao_v:
Timer tm= new Timer (1000,tw);
tm.start;
...................
这样就可以每1秒钟启动一个你需要的处理业务逻辑的流程(在一个新的线程上).
查了一下Timer类的源码,好像不是执行新的线程吧?你从哪句看出来Timer执行任务时创建新的线程?麻烦贴一下源码看看?谢谢!
wuxiao_v 2007-12-18
  • 打赏
  • 举报
回复
public void actionPerformed(ActionEvent e){
//在这个方法中写你的业务逻辑
}

//忘了写参数了
wuxiao_v 2007-12-18
  • 打赏
  • 举报
回复

如果你想模拟多用户并发可以这么做
..............................
public class Twork implements Actionlistner{

Twork(){}


public void actionPerformed(){
//在这个方法中写你的业务逻辑
}


}

Twork tw= new Twork();
Timer tm= new Timer (1000,tw);
tm.start;
...................
这样就可以每1秒钟启动一个你需要的处理业务逻辑的流程(在一个新的线程上).
wuxiao_v 2007-12-18
  • 打赏
  • 举报
回复
可以概括成一句话 Timer每隔一定时间启动一个线程执行相应的任务
wuxiao_v 2007-12-18
  • 打赏
  • 举报
回复
Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器 new Timer(int x, xxlistner lis)
就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的,但是不管怎么定义他都是运行在一个新的线程上的.
加载更多回复(3)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧