我想在我的java应用程序中使用Thread.sleep().但是不起作用.删除睡眠后程序有效.
在我的程序中,我正在运行多个线程,并希望每个线程以可变速度向前移动.有些人可能会被处理得更少一些.所以我使用随机数作为参数使用睡眠.如果有另一种方法可以做到这一点.不用睡觉.
这是我使用睡眠功能的部分.
public void run()
{
Random r = new Random();
int t;
while(true)
{
if(total == 1)
{
// win();
break;
}
if(doa == 1)
break;
// Player x = e[r.nextInt(20)%2];
Player x = choose();
x.attack(this, 10 + (power==1?5:0));
if(r.nextInt(100)%(5 - (power==2?2:0)) == 0)
System.out.println(" " + name + " used Potion effect (" + potionno++ + ") .. now " + name + "'s Health is " + (h+= 10 + r.nextInt(20)));
try
{
sleep(50 + r.nextInt(1000));
}
catch(InterruptedException c)
{ ; }
}
if(doa == 1)) {
// and so on
.
Run Code Online (Sandbox Code Playgroud)
.
这是我用于启动的doGet函数
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String s;
s = request.getParameter("name");
try{
Player.out = out;
Player.e[0] = new Player("Kartik",2);
Player.e[1] = new Player(s,1);
Player.e[2] = new Player("Anirudh",3);
Player.e[3] = new Player("Vinita");
Player.e[4] = new Player("Shivank");
for(Player p: Player. e)
p.start();
}
catch(Exception e)
{
out.print("WRONG");
}
}
Run Code Online (Sandbox Code Playgroud)
你不应该这样做,因为一般来说,Java EE/servlet容器假设他们的应用程序不会产生Thread.sleep()他们自己的所有nilly willy的线程(或修改你正在使用的现有的线程的执行或配置).
这是可能的,但除非你知道自己在做什么,否则通常不赞成.看到这个简洁而又出色地解释原因的答案:https://stackoverflow.com/a/533847/201722
至于为什么你的调用Thread.sleep()不起作用,这是因为你的servlet容器是多线程的.您的调用Thread.sleep()只是将处理当前HTTP请求的线程置于休眠状态.但容器还活着并且在踢.如果您发送另一个HTTP请求,它将获取另一个与您进入休眠状态的线程不同的线程来处理它.
所以,从您的POV看,它看起来不起作用.但是它正在工作,你让可怜的线程进入睡眠状态,容器就可以了,这是另一个适合你的.碰巧你不知道到底发生了什么.
我建议你花时间浏览Oracle(前Sun.)Google提供的Java和Java EE教程,你会发现它.
==编辑==
我还建议OP阅读以下简洁的解释,不加区别地插入容器中的线程.
http://www.psionicwave.com/blog/2012/12/15/threading-in-web-containers/
| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |